mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@240 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
878819630c
commit
645f7f13d5
@ -1,19 +0,0 @@
|
||||
BasicInfo:
|
||||
Title : $(TITLE)
|
||||
BackupMemoryType: None
|
||||
Logo : Nintendo
|
||||
# Companycode: "00"
|
||||
ProductCode : "CTR-P-22MA"
|
||||
# MediaSize: 2GB
|
||||
|
||||
AccessControlInfo:
|
||||
FileSystemAccess:
|
||||
- Debug
|
||||
|
||||
Rom:
|
||||
HostRoot : $(ROMFS_ROOT)
|
||||
|
||||
TitleInfo:
|
||||
# UniqueId: 0xffff6
|
||||
UniqueId: 0xf8015
|
||||
Version: 0
|
||||
@ -1,69 +0,0 @@
|
||||
#!/usr/bin/env omake
|
||||
#----------------------------------------------------------------------------
|
||||
# Project: Horizon
|
||||
# File: OMakefile
|
||||
#
|
||||
# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs contain
|
||||
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
# Company Ltd., and are protected by Federal copyright law. They may
|
||||
# not be disclosed to third parties or copied or duplicated in any form,
|
||||
# in whole or in part, without the prior written consent of Nintendo.
|
||||
#
|
||||
# $Rev: 31765 $
|
||||
#----------------------------------------------------------------------------
|
||||
SUPPORTED_TARGETS = CTR-*.Process.MPCore.*
|
||||
|
||||
#demoライブラリ位置指定
|
||||
#SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir ../common/include)
|
||||
#SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir ../CTR_SDK/sampledemos/common/include)
|
||||
#INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR)
|
||||
|
||||
|
||||
SOURCES[] =
|
||||
./source/main.cpp
|
||||
./source/test_data.cpp
|
||||
../common/sleep.cpp
|
||||
../common/common.cpp
|
||||
../common/shfnt.cpp
|
||||
|
||||
OBJECTS[] =
|
||||
$`(ObjectFromBinary $(TARGET), ./Imp_list/key/Public_Key.der)
|
||||
|
||||
TARGET_PROGRAM = CtrSaveDataMover_imp
|
||||
|
||||
TITLE = CSM_imp
|
||||
|
||||
LIBS += libnn_ps
|
||||
|
||||
IMPORTEE_CIA = importee.cia
|
||||
|
||||
#SRC_IMPORTEE_PATH = ../body/images/$(BUILD_TARGET_DIR)/$(BUILD_TYPE_DIR)/CtrSaveDataMover.cia
|
||||
#とりあえず、マスタリング時は直おき、配置時に改名
|
||||
SRC_IMPORTEE_PATH = CtrSaveDataMover_master.cia
|
||||
|
||||
# ビルドタイプ別に romfs を作る
|
||||
#ROMFS_ROOT = $`(TARGET.getObjectDirectory)/romfsroot
|
||||
ROMFS_ROOT = ./romfiles
|
||||
DEST_IMPORTEE_PATH = $(ROMFS_ROOT)/$(IMPORTEE_CIA)
|
||||
foreach(TARGET, $(BUILDER.getTargets $(SUPPORTED_TARGETS)))
|
||||
$(DEST_IMPORTEE_PATH): $(SRC_IMPORTEE_PATH) $(makeDirectory $(ROMFS_ROOT))
|
||||
cp $< $@
|
||||
ROMFS_DEPENDENCIES = $(DEST_IMPORTEE_PATH)
|
||||
|
||||
# プログラムから参照するためのROMFSのパスとプログラムIDを定義する
|
||||
ROMFS_IMPORTEE_PATH = L\"rom:/$(IMPORTEE_CIA)\"
|
||||
CCFLAGS += -DROMFS_IMPORTEE_PATH=$(ROMFS_IMPORTEE_PATH)
|
||||
|
||||
ROM_SPEC_FILE = Imp.rsf
|
||||
DESCRIPTOR = $(CTRSDK_ROOT)/resources/specfiles/repairtool.desc
|
||||
|
||||
# バナー、アイコン
|
||||
#CTR_BANNER_SPEC = banner.bsf
|
||||
CTR_BANNER_SPEC = banner_null_icon.bsf
|
||||
|
||||
include $(ROOT_OMAKE)/modulerules
|
||||
|
||||
build: $(DEFAULT_TARGETS)
|
||||
|
||||
Binary file not shown.
@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,2 +0,0 @@
|
||||
-p
|
||||
-t
|
||||
@ -1,16 +0,0 @@
|
||||
#作成例です
|
||||
#シリアルは左詰で半角のみ
|
||||
#四角く囲まれた数字=Digitは省く
|
||||
#コメントは全角もOK
|
||||
|
||||
#グループA
|
||||
CJN10001372
|
||||
EJF10000237
|
||||
EJF10001230
|
||||
|
||||
#グループB
|
||||
EJF10002236
|
||||
EJF10003232
|
||||
EJF10004231
|
||||
EJF10005237
|
||||
#-- END --
|
||||
@ -1,4 +0,0 @@
|
||||
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,3 +0,0 @@
|
||||
rem ver1.0.0—p
|
||||
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
|
||||
@ -1,7 +0,0 @@
|
||||
@echo off
|
||||
if "%1"=="" goto 1
|
||||
openssl dgst -sha256 -binary -keyform DER -sign ../key/private_key.der -out csm_sign.dat %1
|
||||
goto end
|
||||
:1
|
||||
openssl dgst -sha256 -binary -keyform DER -sign ../key/private_key.der -out csm_sign.dat csm_list.txt
|
||||
:end
|
||||
@ -1,5 +0,0 @@
|
||||
秘密鍵の扱いは注意
|
||||
署名作成する必要の無い所には出さない
|
||||
|
||||
署名作成時は、配布先で使用するバージョンに入っている
|
||||
鍵とペアの秘密鍵を使うこと
|
||||
@ -1,45 +0,0 @@
|
||||
|
||||
本体印刷のシリアル最後尾の四角い枠に入った数字は
|
||||
digitというものらしい
|
||||
リスト作成時に入力違いをチェックするのに使えそう
|
||||
コマンドラインでファイル指定する簡単なチェッカーとか
|
||||
|
||||
|
||||
以下、長谷川さんメール抜粋
|
||||
----------------
|
||||
チェックデジットの計算方法は一般的なものらしく、
|
||||
"モジュラス10 ウェイト3・1(M10W31)"というものらしいです。
|
||||
|
||||
|
||||
// NULL終端されたシリアルナンバーを受け取る
|
||||
// NULL文字の場所にチェックデジットを付加して新たにNULL終端する
|
||||
void AddCheckDigit(char* serial)
|
||||
{
|
||||
size_t len = std::strlen(serial);
|
||||
|
||||
u8 digit = 0;
|
||||
bool odd = true;
|
||||
for(u8 i = len - 1; i > 0 && std::isdigit(serial[i]); i--)
|
||||
{
|
||||
if(odd)
|
||||
{
|
||||
digit += (serial[i] - '0') * 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
digit += (serial[i] - '0');
|
||||
}
|
||||
odd = !odd;
|
||||
}
|
||||
|
||||
if(digit % 10 != 0)
|
||||
{
|
||||
serial[len] = 10 - (digit % 10) + '0';
|
||||
}
|
||||
else
|
||||
{
|
||||
serial[len] = '0';
|
||||
}
|
||||
|
||||
serial[len + 1] = '\0';
|
||||
}
|
||||
@ -1,27 +0,0 @@
|
||||
|
||||
目的:許可した本体のみインポート
|
||||
|
||||
公開鍵はROMから読み込む
|
||||
|
||||
SC) ツール用本体のシリアルをメールなどでREDへ連絡
|
||||
RED) リスト(csm_list)と署名(csm_sign)を作成し送る
|
||||
|
||||
|
||||
インポート手順
|
||||
・ リスト、署名を書き込んだSDをCTRに差す
|
||||
・ インポート用アプリをカード起動
|
||||
・ 有効な本体ならインポートメニューが表示される
|
||||
|
||||
|
||||
署名はOpeneelで作成
|
||||
特に手を加えずSDルートに置く
|
||||
|
||||
リストの書き方
|
||||
インポート許可シリアルをテキストで羅列
|
||||
---
|
||||
aaaaaaaa
|
||||
bbbbbbbb
|
||||
----
|
||||
本体裏シリアル終端のdigit(四角い枠の数字)は省く
|
||||
digit確認したい場合はリスト作成時にやっとく
|
||||
ファイルサイズは64Kまで(シリアルのみ記載で、およそ4000台)
|
||||
Binary file not shown.
@ -1,11 +0,0 @@
|
||||
<インポータのオプション有効化>
|
||||
|
||||
cms_inf.txtの名前でファイル作成しSDのルート下に配置
|
||||
以下の記述でオプションが有効になる
|
||||
デバグや不具合調査時用、通常はいらない
|
||||
|
||||
-t: テストメニュー
|
||||
カード上のセーブにテストパターン書き込み&ベリファイ
|
||||
|
||||
-p: 本体シリアルを表示
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -1,490 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: main.cpp
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <nn.h>
|
||||
#include <nn/fs.h>
|
||||
#include <nn/cfg/CTR/cfg_ApiSys.h>
|
||||
#include <nn/cfg/CTR/cfg_ApiInit.h>
|
||||
#include <nn/am/am_ApiLocalImporter.h>
|
||||
#include <nn/am/am_ApiSystemMenu.h>
|
||||
#include <nn/applet.h>
|
||||
#include <nn/ndm.h>
|
||||
#include <nn/ndm/ndm_DebugControl.h>
|
||||
#include <nn/crypto/crypto_RsaKey.h>
|
||||
#include <nn/ps/ctr/ps_Api.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "demo.h"
|
||||
#include "../common/ver.h"
|
||||
#include "../common/sleep.h"
|
||||
#include "../common/common.h"
|
||||
#include "../common/shfnt.h"
|
||||
#include "test_data.h"
|
||||
|
||||
#define INF_FILE "sdmc:/csm_inf.txt"
|
||||
|
||||
#define KEY_LENGTH 2048
|
||||
#define LIST_FILE "sdmc:/csm_list.txt"
|
||||
#define SIGN_FILE "sdmc:/csm_sign.dat"
|
||||
|
||||
|
||||
extern "C" {
|
||||
extern u8* PUBLIC_KEY_BEGIN[];
|
||||
extern u8* PUBLIC_KEY_END[];
|
||||
|
||||
const void* PUBLIC_KEY = PUBLIC_KEY_BEGIN;
|
||||
}
|
||||
|
||||
demo::RenderSystemDrawing s_RenderSystem;
|
||||
nn::fnd::ExpHeap appHeap;
|
||||
uptr heapForGx;
|
||||
void ErrorStop(char *s);
|
||||
void ErrorPOff(char *s);
|
||||
|
||||
const size_t ROMFS_BUFFER_SIZE = 64*1024;//ROMマウント用
|
||||
const size_t READ_BUFFER_SIZE = 64*1024;
|
||||
|
||||
#define SDK_SER_LEN nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN
|
||||
|
||||
namespace
|
||||
{
|
||||
u8* readBuf;
|
||||
u8* romfsBuf;
|
||||
|
||||
}
|
||||
nn::Result result;
|
||||
|
||||
|
||||
bool ImportFile(nn::fs::MediaType mediaType, wchar_t* filename)
|
||||
{
|
||||
//nn::Result result;
|
||||
|
||||
nn::fs::FileOutputStream* stream;
|
||||
result = nn::am::BeginImportProgram(&stream, mediaType);
|
||||
if (result.IsSuccess())
|
||||
{
|
||||
//NN_LOG("Importing: %ls...", filename);
|
||||
nn::fs::FileInputStream in(filename);
|
||||
|
||||
while(s32 read = in.Read(readBuf, READ_BUFFER_SIZE))
|
||||
{
|
||||
stream->Write(readBuf, read);
|
||||
}
|
||||
result = nn::am::EndImportProgram(stream);
|
||||
}
|
||||
return result.IsSuccess();
|
||||
}
|
||||
|
||||
#define LIST_MAX 4000
|
||||
#define LIST_LENGTH (LIST_MAX * (nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN+1))
|
||||
u8 s_list[LIST_MAX][nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN+1];//シリアルリスト
|
||||
u8 sign[256];//署名
|
||||
u8 serialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN+1];
|
||||
|
||||
//本体シリアル取得
|
||||
int GettedSerLen;
|
||||
bool GetSerial(){
|
||||
nn::cfg::CTR::init::Initialize();
|
||||
nn::cfg::CTR::system::Initialize();
|
||||
result = nn::cfg::CTR::system::GetSerialNo(serialNo);
|
||||
nn::cfg::CTR::system::Finalize();
|
||||
nn::cfg::CTR::init::Finalize();
|
||||
serialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN] = 0;
|
||||
GettedSerLen = strlen((char*)serialNo);
|
||||
return result.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//#define setColor(r,g,b,a) s_RenderSystem.SetColor(r,g,b,a)
|
||||
void setColor(f32 r,f32 g,f32 b,f32 a){ shf_SetColor(r,g,b,a);}
|
||||
//#define setText(x,y,s) s_RenderSystem.DrawText(x,y,s)
|
||||
void drawText(u16 x,u16 y,char *s){ shf_DrawText_0( x,y,s);}
|
||||
//上はASCIIのみ対応したTextWriterへのラッパ
|
||||
//日本語表示の場合、WideTextWriterを使う(要sft_側の関数追加)
|
||||
|
||||
|
||||
nn::hid::PadReader *hpr;
|
||||
//入力待ち
|
||||
nn::hid::PadStatus padStatus;
|
||||
u32 WaitKey(u32 mask)
|
||||
{
|
||||
|
||||
while(1){
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
//終了
|
||||
void endfunc()
|
||||
{
|
||||
appHeap.Free(reinterpret_cast<void*>(readBuf));
|
||||
appHeap.Free(reinterpret_cast<void*>(romfsBuf));
|
||||
nn::hid::Finalize();
|
||||
SharedFontFinalize();
|
||||
nngxWaitVSync(NN_GX_DISPLAY_BOTH);//SDK2.0以降では不要?
|
||||
s_RenderSystem.Finalize();
|
||||
}
|
||||
|
||||
//署名検証
|
||||
bool VeriRsa(u8* src,size_t sz,u8* sig)
|
||||
{
|
||||
nn::crypto::RsaKey key;
|
||||
//nn::crypto::Initialize();
|
||||
nn::ps::CTR::Initialize();
|
||||
result = key.InitializePublicKey(PUBLIC_KEY_BEGIN,KEY_LENGTH);
|
||||
if (result.IsSuccess())
|
||||
{
|
||||
result = nn::ps::CTR::VerifyRsaSha256(src,sz,sig,key);
|
||||
}
|
||||
//nn::crypto::Finalize();
|
||||
nn::ps::CTR::Finalize();
|
||||
return result.IsSuccess();
|
||||
}
|
||||
|
||||
//エラー
|
||||
void ErrorCommon(char *s,char *ss)
|
||||
{
|
||||
char str[128];
|
||||
nn::am::FinalizeForLocalImporter();
|
||||
nn::fs::Unmount("sdmc:");
|
||||
nn::fs::Unmount("rom:");
|
||||
NN_LOG(s);
|
||||
NN_LOG(" result = %d\n",result.GetDescription());
|
||||
shf_SetScale(0.7,0.7);
|
||||
setColor(1.0, 0.0, 0.0,1.0);
|
||||
strcpy(str,"Error: ");
|
||||
strcat(str,s);
|
||||
drawText(10,100,str);
|
||||
drawText(10,140,ss);
|
||||
}
|
||||
|
||||
|
||||
void ErrorStop(char *s)
|
||||
{
|
||||
ErrorCommon(s,"Push Home Button & end");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
WaitKey(0);
|
||||
}
|
||||
|
||||
void ErrorPoff(char *s)
|
||||
{
|
||||
ErrorCommon(s,"Push Power Button & Power Off");
|
||||
drawText(10,160,"Home Button is invalid");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
WaitKey(0);
|
||||
}
|
||||
|
||||
|
||||
//改行後の位置を返す、0=見つからなかった
|
||||
int CrLf(int n,int max)
|
||||
{
|
||||
u8 d;
|
||||
while(n < max)
|
||||
{
|
||||
d = readBuf[n];
|
||||
if (d==0x0a)return n+1;//LF
|
||||
if (d==0x0d)//CR
|
||||
{
|
||||
if (n == max-1)return 0;//終端
|
||||
n++;
|
||||
if (readBuf[n]==0x0a)return n+1;//CR+LF
|
||||
ErrorStop("list broken");//CRのみは異常、署名時にファイル壊れてた?
|
||||
}
|
||||
n++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
nn::fs::FileInputStream fi;
|
||||
//ファイルリード
|
||||
s32 FileRead(char* fname)
|
||||
{
|
||||
s32 size;
|
||||
result = fi.TryInitialize(fname);
|
||||
if (result.IsFailure()){//open error
|
||||
//NN_LOG("desc= %d\n",result.GetDescription());
|
||||
return 0;
|
||||
}
|
||||
result = fi.TryRead(&size,readBuf,READ_BUFFER_SIZE);
|
||||
fi.Finalize();
|
||||
if (result.IsFailure()){
|
||||
//NN_LOG("desc= %d\n",result.GetDescription());
|
||||
return 0;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
char ver[16];
|
||||
char seri[32];
|
||||
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());
|
||||
|
||||
//中断処理の準備
|
||||
InitSysBreak((uptr)endfunc);
|
||||
// グラフィックスライブラリの初期化は、以降で行わなければならない
|
||||
// 他、アプリケーションの初期化処理
|
||||
|
||||
nn::hid::Initialize();
|
||||
nn::hid::PadReader padReader;
|
||||
hpr = &padReader;
|
||||
|
||||
//result = nn::ns::CTR::InitializeForShell();
|
||||
//if (result.IsSuccess())
|
||||
result = nn::am::InitializeForLocalImporter();
|
||||
|
||||
nn::applet::DisableSleep();//スリープ非対応
|
||||
|
||||
// ヒープの確保
|
||||
appHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR);
|
||||
|
||||
const u32 s_GxHeapSize = 0x800000;
|
||||
// RenderSystem の準備
|
||||
heapForGx = reinterpret_cast<uptr>(appHeap.Allocate(s_GxHeapSize));
|
||||
s_RenderSystem.Initialize(heapForGx, s_GxHeapSize);
|
||||
SharedFontInit();
|
||||
|
||||
// 共有フォントの種類を取得
|
||||
//nn::pl::SharedFontType sftype = nn::pl::GetSharedFontType();
|
||||
|
||||
// スリープ要求に対する返答を有効にする
|
||||
// また、蓋の状態チェックを行い蓋が閉じられているならスリープ要求が発生する
|
||||
// nn::applet::EnableSleep(true);
|
||||
|
||||
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0);
|
||||
s_RenderSystem.Clear();
|
||||
// s_RenderSystem.SetFontSize(12);
|
||||
shf_SetScale(0.8,0.6);
|
||||
setColor(1.0,1.0,1.0,1.0);
|
||||
drawText(20,20,"CTR Card Savedata Mover Setup");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
shf_SetScale(0.5,0.5);
|
||||
sprintf(ver,"version %.2f",VERSION);
|
||||
drawText(250,40,ver);
|
||||
|
||||
shf_SetScale(0.7,0.7);
|
||||
if (result.IsFailure())ErrorStop("Initialize");//初期化に失敗
|
||||
if (READ_BUFFER_SIZE < LIST_LENGTH)ErrorStop("buffer size");//バッファサイズのチェック
|
||||
|
||||
//ファイルバッファ
|
||||
//カゲマイ上のSDリード速度比較実験で32アラインが良かったので、おまじない
|
||||
//回数もサイズも少ないので気にする必要ないかも
|
||||
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");//本体シリの取得に失敗
|
||||
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
//シリアル表示(オプション)後にチェック
|
||||
//デバッガ=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){//インポート許可本体
|
||||
drawText(80,100,"Push X : Import");
|
||||
drawText(80,140,"Push Y : Delete");
|
||||
mask |= nn::hid::BUTTON_X | nn::hid::BUTTON_Y;
|
||||
}
|
||||
|
||||
//本体機能で消せるようなったら、そっち使うべき
|
||||
//将来的にdeleteは省いていいかも
|
||||
|
||||
|
||||
if (flg_test)//テストメニュー
|
||||
{
|
||||
drawText(80,160,"Push R : Test Data");
|
||||
mask |= nn::hid::BUTTON_R;
|
||||
}
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
if (mask == 0)ErrorStop("Serial Check");//実行できるメニューないときトラップ
|
||||
|
||||
u32 trg = WaitKey(mask);
|
||||
if (trg & nn::hid::BUTTON_R){
|
||||
shf_SetScale(0.6,0.6);
|
||||
TestMain();//テストデータへ
|
||||
}
|
||||
|
||||
nn::fs::MountRom(16, 16, romfsBuf, ROMFS_BUFFER_SIZE);
|
||||
|
||||
shf_SetScale(0.8,0.8);
|
||||
// CIA のプログラム ID を取得する。
|
||||
nn::am::ProgramInfo programInfo;
|
||||
if (nn::am::GetProgramInfoFromCia(&programInfo, ROMFS_IMPORTEE_PATH).IsFailure())ErrorStop("cia infomation");
|
||||
|
||||
// Imprting/Delete 表示
|
||||
s_RenderSystem.Clear();
|
||||
if(trg & nn::hid::BUTTON_X) drawText(10,120,"Importing");
|
||||
else drawText(10,120,"Delete");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
// HOME ボタン禁止
|
||||
//Homeで中断するとアイコンが更新されない、電源OFF画面からHomeは問題なし
|
||||
prohibitHome = true;
|
||||
|
||||
// 既に存在するものをインポートするとエラーが返ってくるので、あらかじめ消しておく。
|
||||
nn::am::DeleteProgram(nn::fs::MEDIA_TYPE_NAND, programInfo.id);
|
||||
// タイトル鍵が違うケースに対応するために、チケットも消しておく。
|
||||
nn::am::DeleteTicket(programInfo.id);
|
||||
|
||||
if(trg & nn::hid::BUTTON_X)
|
||||
{
|
||||
// CIA をインポート
|
||||
if (ImportFile(nn::fs::MEDIA_TYPE_NAND, ROMFS_IMPORTEE_PATH)==false)ErrorPoff("Import");
|
||||
}
|
||||
nn::fs::Unmount("rom:");
|
||||
|
||||
s_RenderSystem.Clear();
|
||||
drawText(10,50,"Complate");
|
||||
drawText(10,120,"Push Power Button & Power Off");
|
||||
drawText(10,140,"Home Button is invalid");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
WaitKey(0);
|
||||
|
||||
}
|
||||
|
||||
@ -1,673 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: main.cpp
|
||||
|
||||
Copyright (C)2010 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <nn.h>
|
||||
#include <nn/hid.h>
|
||||
#include "demo.h"
|
||||
|
||||
nn::Result res;
|
||||
|
||||
nn::fs::FileOutputStream fout;
|
||||
nn::fs::FileInputStream fin;
|
||||
|
||||
nn::fs::Directory dc[256];
|
||||
|
||||
wchar_t file_pathw[1024];
|
||||
char file_path[1024];
|
||||
char file_path2[1024];
|
||||
char src_buff[1024*1024];
|
||||
char get_buff[1024*1024];
|
||||
char str[512];
|
||||
|
||||
|
||||
extern demo::RenderSystemDrawing s_RenderSystem;
|
||||
|
||||
//終了処理
|
||||
extern void finish(void);
|
||||
extern u32 WaitKey(u32 mask);
|
||||
|
||||
extern void setColor(f32 r,f32 g,f32 b,f32 a);
|
||||
extern void drawText(u16 x,u16 y,char *s);
|
||||
void drawText(u16 x,u16 y,char *s,int v)
|
||||
{
|
||||
sprintf(str,s,v);
|
||||
drawText( x,y,str);
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------- テストパターン
|
||||
void make_pattern()
|
||||
{
|
||||
int i,j;
|
||||
j=0;
|
||||
for (i=0;i<1024*1024;i++){
|
||||
src_buff[i] = j+i;
|
||||
if (i & 0x100)j++;
|
||||
}
|
||||
}
|
||||
|
||||
//TEST ライト
|
||||
s32 size;
|
||||
#define SIZE_TEST1 421888
|
||||
//#define SIZE_TEST1 244736 //dup
|
||||
bool Test1_W()
|
||||
{
|
||||
int total,size2;
|
||||
|
||||
res = nn::fs::FormatSaveData(1,0,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;
|
||||
}
|
||||
res = nn::fs::TryCreateFile(L"data:/test1.bin",SIZE_TEST1);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Create Fail");
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
res = fout.TryInitialize(L"data:/test1.bin",true);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"open Fail");
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
total =0;
|
||||
size2 = 512;
|
||||
//size2 = 4096;
|
||||
//size2 = SIZE_TEST1;
|
||||
while(1){
|
||||
res = fout.TryWrite( &size,&src_buff[total],size2);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"write Fail");
|
||||
fout.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
total += size;
|
||||
sprintf(str,"size %d",total);
|
||||
s_RenderSystem.Clear();
|
||||
drawText(10,80,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
//if (size<512)break;
|
||||
if (total >= SIZE_TEST1)break;
|
||||
if ((SIZE_TEST1 - total) < 512)size2 = SIZE_TEST1 - total ;
|
||||
}
|
||||
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 Test1_V()
|
||||
{
|
||||
int i,total;
|
||||
|
||||
res = fin.TryInitialize(L"data:/test1.bin");
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"open Fail");
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
total =0;
|
||||
while(1){
|
||||
res = fin.TryRead( &size,&get_buff[total],512);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"read Fail");
|
||||
fin.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
//if (size == 0)break;
|
||||
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;
|
||||
|
||||
}
|
||||
if (total >= SIZE_TEST1)break;
|
||||
|
||||
total += size;
|
||||
s_RenderSystem.Clear();
|
||||
sprintf(str,"now %d",total);
|
||||
drawText(10,80,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
if (size<512)break;
|
||||
}
|
||||
fout.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
drawText(10,100,"end");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//ファイル数
|
||||
bool Test2_W(int n)
|
||||
{
|
||||
int total,size2;
|
||||
|
||||
res = nn::fs::FormatSaveData(680,1,false);//dupなしファイル680
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"format Fail");
|
||||
return false;
|
||||
}
|
||||
res =nn::fs::MountSaveData();
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Mount Fail");
|
||||
return false;
|
||||
}
|
||||
|
||||
total =0;
|
||||
int num = 0;
|
||||
size2 = 512;
|
||||
while(1){
|
||||
sprintf(file_path,"data:/test%d.bin",num);
|
||||
// res = nn::fs::TryCreateFile(L"data:/test2.bin",SIZE_TEST1);
|
||||
// if (res.IsFailure()){
|
||||
// drawText(8,100,"Create Fail");
|
||||
// nn::fs::Unmount("data:");
|
||||
// return false;
|
||||
// }
|
||||
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],size2);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"write Fail");
|
||||
fout.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
fout.Finalize();
|
||||
total += size;
|
||||
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 Test2_V(int n)
|
||||
{
|
||||
int total,size2,i;
|
||||
|
||||
total =0;
|
||||
int num = 0;
|
||||
size2 = 512;
|
||||
while(1){
|
||||
sprintf(file_path,"data:/test%d.bin",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],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();
|
||||
|
||||
total += size;
|
||||
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::Unmount("data:");
|
||||
NN_LOG("total %d",total);
|
||||
drawText(10,100,"end");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
return true;
|
||||
}
|
||||
|
||||
#define DirDepth 80
|
||||
|
||||
//ディレクトリ深度
|
||||
bool Test3_W()
|
||||
{
|
||||
int total,size2;
|
||||
|
||||
res = nn::fs::FormatSaveData(200,200,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;
|
||||
size2 = 512;
|
||||
strcpy(file_path,"data:");
|
||||
while(1){
|
||||
sprintf(str,"/%d",num);
|
||||
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();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
fout.Finalize();
|
||||
|
||||
num++;
|
||||
total+=size;
|
||||
s_RenderSystem.Clear();
|
||||
sprintf(str,"num %d",num);
|
||||
drawText(10,80,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
if (num == DirDepth)break;
|
||||
}
|
||||
|
||||
nn::fs::CommitSaveData();
|
||||
nn::fs::Unmount("data:");
|
||||
|
||||
drawText(10,100,"end");
|
||||
sprintf(str,"length = %d",(int)strlen(file_path2));
|
||||
drawText(8,110,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Test3_V()
|
||||
{
|
||||
int i,total,size2;
|
||||
|
||||
int num = 0;
|
||||
total =0;
|
||||
size2 = 512;
|
||||
strcpy(file_path,"data:");
|
||||
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");
|
||||
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();
|
||||
|
||||
num++;
|
||||
total+=size;
|
||||
s_RenderSystem.Clear();
|
||||
sprintf(str,"num %d",num);
|
||||
drawText(10,80,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
if (num == DirDepth) break;
|
||||
}
|
||||
|
||||
nn::fs::Unmount("data:");
|
||||
drawText(10,100,"end");
|
||||
sprintf(str,"length = %d",(int)strlen(file_path2));
|
||||
drawText(8,110,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
return true;
|
||||
}
|
||||
|
||||
//max size of name
|
||||
#define max_len 16
|
||||
bool Test4_W()
|
||||
{
|
||||
int i;
|
||||
|
||||
res = nn::fs::FormatSaveData(1,0,true);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"format Fail");
|
||||
return false;
|
||||
}
|
||||
res =nn::fs::MountSaveData();
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Mount Fail");
|
||||
return false;
|
||||
}
|
||||
|
||||
strcpy(str,"data:/");
|
||||
for (i =6;i<max_len+6;i++)str[i] = '-';
|
||||
str[i] = 0;
|
||||
res = fout.TryInitialize(str,true);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Open Fail");
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
res = fout.TryWrite( &size,&src_buff[0],512);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Write Fail");
|
||||
fout.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
fout.Finalize();
|
||||
nn::fs::CommitSaveData();
|
||||
nn::fs::Unmount("data:");
|
||||
return (size == 512);
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool Test4_V()
|
||||
{
|
||||
int i;
|
||||
|
||||
strcpy(str,"data:/");
|
||||
for (i =6;i<max_len+6;i++)str[i] = '-';
|
||||
str[i] = 0;
|
||||
res = fin.TryInitialize(str);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Open Fail");
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
res = fin.TryRead( &size,&get_buff[0],512);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Read Fail");
|
||||
fin.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
fin.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
if (size != 512)return false;
|
||||
|
||||
for (i=0;i<size;i++) if (src_buff[i] != get_buff[i])
|
||||
{
|
||||
drawText(8,100,"verifi Fail at %d",i);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
#define SIZE_TEST5 (512*100)
|
||||
//生成サイズに満たないデータ
|
||||
bool Test5_W()
|
||||
{
|
||||
int pos;
|
||||
|
||||
res = nn::fs::FormatSaveData(1,0,true);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"format Fail");
|
||||
return false;
|
||||
}
|
||||
res =nn::fs::MountSaveData();
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Mount Fail");
|
||||
return false;
|
||||
}
|
||||
|
||||
res = nn::fs::TryCreateFile(L"data:/test5.bin",SIZE_TEST5);
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Create Fail");
|
||||
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;
|
||||
while(1){
|
||||
fout.SetPosition(pos);
|
||||
res = fout.TryWrite( &size,&src_buff[pos],512);
|
||||
if (res.IsFailure() || (size!=512)){
|
||||
drawText(8,100,"write Fail");
|
||||
fout.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
sprintf(str,"position %d",pos);
|
||||
s_RenderSystem.Clear();
|
||||
drawText(10,80,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
pos += 1024;//512飛ばす
|
||||
if (pos >= SIZE_TEST5)break;
|
||||
}
|
||||
fout.Finalize();
|
||||
nn::fs::CommitSaveData();
|
||||
nn::fs::Unmount("data:");
|
||||
drawText(10,100,"end");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Test5_V()
|
||||
{
|
||||
int i,pos;
|
||||
|
||||
res = fin.TryInitialize(L"data:/test5.bin");
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"open Fail");
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
pos =0;
|
||||
while(1){
|
||||
fin.SetPosition(pos);
|
||||
res = fin.TryRead( &size,&get_buff[pos],512);
|
||||
if (res.IsFailure() || (size!=512)){
|
||||
drawText(8,100,"read Fail");
|
||||
fin.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
return false;
|
||||
}
|
||||
sprintf(str,"position %d",pos);
|
||||
s_RenderSystem.Clear();
|
||||
drawText(10,80,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
for (i=0;i<512;i++) if (src_buff[pos+i] != get_buff[pos+i])
|
||||
{
|
||||
drawText(8,100,"verifi Fail at %d",i);
|
||||
return false;
|
||||
}
|
||||
pos += 1024;//512飛ばす
|
||||
if (pos >= SIZE_TEST5)break;
|
||||
}
|
||||
fin.Finalize();
|
||||
nn::fs::Unmount("data:");
|
||||
drawText(10,100,"end");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#define menu_ct 6
|
||||
#define menu_max (menu_ct-1)
|
||||
char* menu_str[menu_ct] = {"Casual check","Large size","many files","Deep directry","max size name","data < create size"};
|
||||
|
||||
#define menu_top_Y 80
|
||||
#define menu_top_X 60
|
||||
#define menu_spc 14
|
||||
|
||||
//---------------------------------------------------------------- main
|
||||
void TestMain()
|
||||
{
|
||||
u32 value;
|
||||
int curs = 0;
|
||||
int i;
|
||||
bool sccs;
|
||||
|
||||
//Render
|
||||
setColor(1.0f,1.0f,1.0f,1.0f);
|
||||
|
||||
//TEST PATTERN
|
||||
make_pattern();
|
||||
|
||||
while(1){
|
||||
|
||||
//menu 表示
|
||||
s_RenderSystem.Clear();
|
||||
drawText(8,20," Backup Verifi for SaveDataMover Test ");
|
||||
drawText(8,40," for 512KB Backup");
|
||||
for (i=0;i<menu_ct;i++)drawText(menu_top_X,menu_top_Y+menu_spc*i,menu_str[i]);
|
||||
drawText(menu_top_X-30,menu_top_Y+menu_spc*curs,"->");
|
||||
drawText(menu_top_X,menu_top_Y+menu_spc*(menu_max+2),"push A:Write ,X:Verifi");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
|
||||
//ボタン待ち
|
||||
value = WaitKey(nn::hid::BUTTON_A | nn::hid::BUTTON_X |nn::hid::BUTTON_UP |nn::hid::BUTTON_DOWN);
|
||||
if (value & nn::hid::BUTTON_A){//ライト
|
||||
sccs = false;
|
||||
s_RenderSystem.Clear();
|
||||
drawText(10,70,"writing");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
switch(curs){
|
||||
case 0:sccs = Test2_W(10);break;
|
||||
case 1:sccs = Test1_W();break;
|
||||
case 2:sccs = Test2_W(680);break;
|
||||
case 3:sccs = Test3_W();break;
|
||||
case 4:sccs = Test4_W();break;
|
||||
case 5:sccs = Test5_W();break;
|
||||
default:break;
|
||||
}
|
||||
}else if (value & nn::hid::BUTTON_X)
|
||||
{//ベリファイ
|
||||
sccs = false;
|
||||
s_RenderSystem.Clear();
|
||||
drawText(10,70,"verifi");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
nngxWaitVSync(NN_GX_DISPLAY0);
|
||||
res =nn::fs::MountSaveData();
|
||||
if (res.IsFailure()){
|
||||
drawText(8,100,"Mount Fail");
|
||||
}else
|
||||
switch(curs){
|
||||
case 0:sccs = Test2_V(10);break;
|
||||
case 1:sccs = Test1_V();break;
|
||||
case 2:sccs = Test2_V(680);break;
|
||||
case 3:sccs = Test3_V();break;
|
||||
case 4:sccs = Test4_V();break;
|
||||
case 5:sccs = Test5_V();break;
|
||||
default:break;
|
||||
}
|
||||
}else if (value & nn::hid::BUTTON_UP){
|
||||
if(curs > 0)curs--;
|
||||
}else if(curs < menu_max)curs++;
|
||||
|
||||
if (value & (nn::hid::BUTTON_A | nn::hid::BUTTON_X)){
|
||||
if (sccs == false)drawText(8,120,"Failed");
|
||||
sprintf(str,"desc %d",res.GetDescription());
|
||||
drawText(10,140,str);
|
||||
s_RenderSystem.SwapBuffers();
|
||||
NN_LOG("desc %d",res.GetDescription());
|
||||
WaitKey(nn::hid::BUTTON_B);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
End of file
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
#ifndef TEST_DATA_H_
|
||||
#define TEST_DATA_H_
|
||||
|
||||
void TestMain();
|
||||
|
||||
#endif
|
||||
@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env omake
|
||||
#----------------------------------------------------------------------------
|
||||
# Project: Horizon
|
||||
# File: OMakefile
|
||||
#
|
||||
# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs contain
|
||||
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
# Company Ltd., and are protected by Federal copyright law. They may
|
||||
# not be disclosed to third parties or copied or duplicated in any form,
|
||||
# in whole or in part, without the prior written consent of Nintendo.
|
||||
#
|
||||
# $Rev: 34658 $
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
#表示にDemoライブラリを使用します
|
||||
#PC環境に合わせてサンプルデモのディレクトリを指定
|
||||
#SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir ../common/include)
|
||||
SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir $(HORIZON_ROOT)/../CTR/sampledemos/common/include)
|
||||
INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR)
|
||||
|
||||
LIBS += lib_demo libnn_am
|
||||
|
||||
.SUBDIRS: $(exist-dirs \
|
||||
body \
|
||||
Imp \
|
||||
)
|
||||
|
||||
DefineDefaultRules()
|
||||
@ -1,73 +0,0 @@
|
||||
#!/usr/bin/env omake
|
||||
#----------------------------------------------------------------------------
|
||||
# Project: Horizon
|
||||
# File: OMakeroot
|
||||
#
|
||||
# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs contain
|
||||
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
# Company Ltd., and are protected by Federal copyright law. They may
|
||||
# not be disclosed to third parties or copied or duplicated in any form,
|
||||
# in whole or in part, without the prior written consent of Nintendo.
|
||||
#
|
||||
# $Rev:$
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
# ディレクトリレイアウトについての説明
|
||||
#
|
||||
# a) ソースコードがルートディレクトリ直下に配置される場合
|
||||
# 例:
|
||||
# /OMakeroot
|
||||
# /foo/bar/OMakefile
|
||||
#
|
||||
# 結果:
|
||||
# OMakefile と同じディレクトリ以下に objects や images が生成されます。
|
||||
#
|
||||
# /foo/bar/objects/...
|
||||
# /foo/bar/images/..
|
||||
#
|
||||
#
|
||||
# b) ソースコードが sources 以下に配置される場合
|
||||
# 例:
|
||||
# /OMakeroot
|
||||
# /sources/foo/bar/OMakefile
|
||||
#
|
||||
# 結果:
|
||||
# ルートディレクトリ以下に objects や images が生成されます。
|
||||
#
|
||||
# /objects/foo/bar/...
|
||||
# /images/foo/bar/...
|
||||
#
|
||||
#
|
||||
|
||||
# ルート環境変数の取得
|
||||
public.HORIZON_ROOT =
|
||||
if $(defined-env HORIZON_ROOT)
|
||||
HORIZON_ROOT = $(absname $(getenv HORIZON_ROOT))
|
||||
export
|
||||
|
||||
if $(defined-env CTRSDK_ROOT)
|
||||
CTRSDK_ROOT = $(absname $(getenv CTRSDK_ROOT))
|
||||
if $(and $(defined-env HORIZON_ROOT), $(not $(equal $(HORIZON_ROOT), $(CTRSDK_ROOT))))
|
||||
eprintln(HORIZON_ROOT と CTRSDK_ROOT が一致しません。同じパスを設定するか、どちらか一方だけを定義して下さい。)
|
||||
exit(1)
|
||||
HORIZON_ROOT = $(CTRSDK_ROOT)
|
||||
export
|
||||
|
||||
if $(not $(HORIZON_ROOT))
|
||||
eprintln($"$$CTRSDK_ROOT が定義されていません")
|
||||
exit(1)
|
||||
|
||||
include $(HORIZON_ROOT)/build/omake/commondefs
|
||||
|
||||
DefineCommandVars()
|
||||
|
||||
.PHONY: all build clean clobber
|
||||
.PHONY: run run-scripts
|
||||
|
||||
#
|
||||
# OMakefile の読み込み
|
||||
#
|
||||
.SUBDIRS: .
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
#!/usr/bin/env omake
|
||||
#----------------------------------------------------------------------------
|
||||
# Project: Horizon
|
||||
# File: Omakefile
|
||||
#
|
||||
# Copyright (C)2010 Nintendo Co., Ltd. All rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs contain
|
||||
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
# Company Ltd., and are protected by Federal copyright law. They may
|
||||
# not be disclosed to third parties or copied or duplicated in any form,
|
||||
# in whole or in part, without the prior written consent of Nintendo.
|
||||
#
|
||||
# $Rev: 25650 $
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
SUPPORTED_TARGETS = CTR-T*.Process.MPCore.*
|
||||
#CTR_APPTYPE = BOTH
|
||||
#CTR_APPTYPE = CARD
|
||||
CTR_APPTYPE = NAND
|
||||
|
||||
#demoライブラリ位置指定
|
||||
#SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir ../common/include)
|
||||
#SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir ../CTR_SDK/sampledemos/common/include)
|
||||
#INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR)
|
||||
|
||||
# ビルドするソースコードを指定します。
|
||||
#SDにセーブする場合はmembak -> exsave 変更
|
||||
SOURCES[] =
|
||||
./source/main.cpp
|
||||
./source/savefile/savedata.cpp
|
||||
./source/savefile/membak.cpp
|
||||
./source/savefile/savefile.cpp
|
||||
./source/screen/screen.cpp
|
||||
./source/gui/gui.cpp
|
||||
../common/shfnt.cpp
|
||||
../common/sleep.cpp
|
||||
../common/common.cpp
|
||||
|
||||
#LIBS += lib_demo libnn_am
|
||||
#LIBS += libnn_ps
|
||||
|
||||
TARGET_PROGRAM = CtrSaveDataMover
|
||||
|
||||
TITLE = CSM_body
|
||||
|
||||
# ROMFS のルートパスを指定します。
|
||||
#ROMFS_ROOT =
|
||||
|
||||
# 独自の RSF ファイルを指定する場合
|
||||
ROM_SPEC_FILE = body.rsf
|
||||
DESCRIPTOR = $(CTRSDK_ROOT)/resources/specfiles/repairtool.desc
|
||||
|
||||
# バナー、アイコン
|
||||
CTR_BANNER_SPEC = banner_null_icon.bsf
|
||||
|
||||
|
||||
#Cia バージョン:マスタリング毎に更新すること
|
||||
#メジャーはrsfで指定(Remasterversion)
|
||||
MAKECIAFLAGS = -minor 0 -micro 10
|
||||
|
||||
include $(ROOT_OMAKE)/modulerules
|
||||
|
||||
build: $(DEFAULT_TARGETS)
|
||||
Binary file not shown.
@ -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
Binary file not shown.
Binary file not shown.
@ -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ęmnęeęmëmvv,v,v-~Č]ÉeÉeęeęeëmëmvęennvv,~-~M†v,~,~-~-~N†N†oŽM~N†N†oŽoŽp–<70>–‘žn,v,v-~-~N†N†oŽ-~N†N†oŽoŽp–p–‘–nŽ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Ë2vk+;-~LmN†Éeęeęeęmęmvv,vëmvv,~,v-~-~N†v«!-~ŚK
moŽK*.uN††oŽ<6F>–íS¬:‘ž˛žv-~«!ÍdM†®}K*«!N†nuoŽpŽkđ…Ndl2oŽ<6F>–L2±ž±ž˛¦kĐt±ž˛¦ržŇŤk.Kl2kp–‘–O}°…˛žnK°td
CđtÓ¦Ô®
KÍBő¶żÍ:’Ťkł•ÍB.KÍB…ń|¦7Ç7Çđc÷ĆXĎy×Ó¦ô®ô®ń|ő¶żk7Ç·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ߛߛߜçśçĽďĽďÝď›çĽçĽď˝ď˝ďÝ÷Ý÷Ţ÷ÝďŢ÷Ţ÷ţ÷Ţ÷˙˙˙˙˙˙›ßśçĽç˝ďĽďÝďÝďŢ÷˝ďÝ÷Ý÷Ţ÷Ţ÷ţ˙ţ˙˙˙Ţ÷Ţ÷ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ţ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙
|
||||
@ -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ęmnęmęmęmnnnvvÉeęeęeęmęmęmęmnęmëmëmnnvvvnvvvv,v,v,~v,v,v-~-~-~-~M†ëmnnvvv,v,~v,vv,~,~-~-~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Žp–oŽ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ëmnnęmëmëmnnvv,vęeęeęmęmęmëmnvęmnnvvvv,vnvv,v,v,~,~-~v,~,~-~-~M~M†N†nvvvv,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Žp–OŽoŽoŽpŽpŽ<70>–<EFBFBD>–‘–pŽ<70>–<EFBFBD>–‘–‘–‘ž‘ž˛žn†oŽoŽoŽoŽp–<70>–<EFBFBD>–oŽ<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ęm‹Tęeęmęmëm
|
||||
nnn+e+]Ë2kkkk‹2ËKęeęmęmn«e«!LknnvvË2k‹2kkKT+;,~,~-~-~-~ěd-~íu-~-~N†N†N†vvŚm,v,v-~-~-~kk+;K*l\N†
e~-~M†M†N†N†N††numm*«!kkkŤKK-~N†N†N†N†Ť\OŽŤdN†oŽoŽoŽoŽ/ŽpŽ<70>–kKkěBp–<70>–<EFBFBD>–‘ž«!kŹ}*¬:P}kkoŽoŽoŽp–p–<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đck2Ë!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ęmnnęeęmęmnnvvvnvvvv,v,v-~ęmëmëmnnvvvnvvvv,~,~-~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ż0lk0lk‘t‘tku®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–pŽ<70>–<EFBFBD>–‘–N†N†N†oŽoŽoŽoŽp–oŽ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ߛߛߛç›ç›çśçĽç›ç›ç›çĽçĽçĽďĽďĽďĽçĽďĽď˝ď˝ďÝď˝ďÝ÷›ß›ç›çĽçĽçĽçĽçĽďśçĽçĽďĽďĽď˝ď˝ďÝďĽď˝ď˝ďÝď˝ďÝ÷Ý÷Ţ÷ÝďÝ÷Ý÷Ţ÷Ţ÷Ţ÷Ţ÷ţ÷Ľď˝ď˝ďÝďÝďÝ÷Ý÷Ţ÷Ý÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷ţ˙Ţ÷Ţ÷Ţ÷ţ˙ţ˙˙˙˙˙˙˙Ţ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷˙˙˙˙˙˙Ţ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙
|
||||
Binary file not shown.
@ -1,29 +0,0 @@
|
||||
# アプリケーションのデフォルト値
|
||||
BasicInfo:
|
||||
# プログラムのタイトル名を指定します。
|
||||
Title : $(TITLE)
|
||||
# BackupMemoryType: 128KB
|
||||
BackupMemoryType: None
|
||||
Logo : Nintendo
|
||||
# CompanyCode: "00"
|
||||
ProductCode : "CTR-N-22NA"
|
||||
|
||||
TitleInfo:
|
||||
# Category: 0x0010
|
||||
# Category: SystemApplication
|
||||
UniqueId: 0xf8014
|
||||
Version: 0
|
||||
|
||||
Rom:
|
||||
HostRoot : romfiles
|
||||
# SaveDataSize: 512K
|
||||
|
||||
AccessControlInfo:
|
||||
UseExtSaveData : false
|
||||
|
||||
FileSystemAccess:
|
||||
- CategoryFileSystemTool
|
||||
|
||||
SystemControlInfo:
|
||||
RemasterVersion: 2
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -1,654 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: main.cpp
|
||||
|
||||
Copyright (C)2010 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <string.h>
|
||||
#include <nn.h>
|
||||
#include <nn/os.h>
|
||||
#include <nn/hid.h>
|
||||
#include "demo.h"
|
||||
#include "gui.h"
|
||||
#include "../../../common/shfnt.h"
|
||||
|
||||
//----------- types etc ---------------
|
||||
typedef struct{
|
||||
u16 x,y;
|
||||
}tU16xy;
|
||||
|
||||
typedef struct{
|
||||
f32 r;
|
||||
f32 g;
|
||||
f32 b;
|
||||
f32 a;
|
||||
}tCol;
|
||||
|
||||
typedef struct{
|
||||
uptr image;
|
||||
tCol color;
|
||||
f32 width;
|
||||
}tStyle;
|
||||
|
||||
typedef void (*FUNCPTR)(u32 value);
|
||||
|
||||
|
||||
//------------------ コンポーネントクラス
|
||||
class cmBase{
|
||||
public:
|
||||
FUNCPTR callback;
|
||||
tU16xy pos;
|
||||
tU16xy size;
|
||||
bool enable;
|
||||
bool visible;
|
||||
u8 scr;
|
||||
u8 padding[1];
|
||||
public:
|
||||
cmBase():enable(false),visible(false){callback = 0;};
|
||||
virtual ~cmBase(){};
|
||||
void SetCallback(uptr adrs){ callback = (FUNCPTR)adrs;};
|
||||
};
|
||||
|
||||
//PADボタン
|
||||
class cmButton: public cmBase
|
||||
{
|
||||
public:
|
||||
u32 mask;//PadStatus.Trigger のマスク
|
||||
public:
|
||||
cmButton(){mask=0;};
|
||||
|
||||
};
|
||||
|
||||
//パネル
|
||||
class cmPanel: public cmBase
|
||||
{
|
||||
public:
|
||||
tStyle style;
|
||||
char *caption;
|
||||
public:
|
||||
cmPanel(){
|
||||
caption="None";
|
||||
style.image = 0;
|
||||
style.color.r = 1.0f;
|
||||
style.color.g = 1.0f;
|
||||
style.color.b = 1.0f;
|
||||
style.color.a = 1.0f;
|
||||
style.width = 2.0f;
|
||||
}
|
||||
};
|
||||
|
||||
//メッセージ
|
||||
class cmMessage: public cmPanel
|
||||
{
|
||||
public:
|
||||
u32 parent;//親コンポーネントID
|
||||
public:
|
||||
cmMessage(){style.width = 8.0f;}
|
||||
};
|
||||
|
||||
|
||||
#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
|
||||
#define MESS_MAX 50
|
||||
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);
|
||||
|
||||
|
||||
//(2011.3.10)本体内蔵フォントに変更
|
||||
//作成時のフォントで画面&タッチ位置を調整
|
||||
|
||||
int pos2tpx(int x)
|
||||
{
|
||||
if (x > 80 )
|
||||
{
|
||||
if (x < 160) return -10;
|
||||
else if (x <230) return -30;
|
||||
else return -50;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//PANEL上の座標かチェック
|
||||
bool onPanel(u16 x,u16 y,cmPanel *p)
|
||||
{
|
||||
int px = pos2tpx(p->pos.x);
|
||||
int pw = pos2tpx(p->size.x);
|
||||
int py = 20;
|
||||
|
||||
if (x <= (p->pos.x + px))return false;
|
||||
if (x >= (p->pos.x + p->size.x + pw))return false;
|
||||
if (y <= p->pos.y + py )return false;
|
||||
if (y >= (p->pos.y + p->size.y))return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
#define setText(x,y,s) shf_DrawText_0(x,y,s)
|
||||
#define setSize(sz) shf_SetSize(sz)
|
||||
|
||||
void setColor(tCol *col)
|
||||
{
|
||||
//s_RenderSystem.SetColor(col->r, col->g, col->b,col->a);
|
||||
shf_SetColor(col->r,col->g,col->b,col->a);
|
||||
}
|
||||
|
||||
//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)
|
||||
{
|
||||
int i;
|
||||
shf_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,"|");
|
||||
|
||||
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;
|
||||
h = (size.y - h) >> 1;
|
||||
if ((w>0) && (h>0)){
|
||||
setText(top.x + w+10,top.y + h,str);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//下画面ボタン表示
|
||||
void drawBox2(tU16xy top,tU16xy size,tStyle *st,char* 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,"|");
|
||||
|
||||
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;
|
||||
h = (size.y - h) >> 1;
|
||||
if ((w>0) && (h>0)){
|
||||
setText(top.x + w+10,top.y + h+10,str);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//描画
|
||||
void drawDisp()
|
||||
{
|
||||
//NN_LOG("draw\n");
|
||||
//上
|
||||
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0);
|
||||
s_RenderSystem.Clear();
|
||||
int i,j;
|
||||
|
||||
for (i=0;i<PANEL_MAX;i++){
|
||||
if ((s_Panel[i].visible) && (s_Panel[i].scr == 0)){
|
||||
drawBox(s_Panel[i].pos,s_Panel[i].size,&s_Panel[i].style,s_Panel[i].caption);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
//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);
|
||||
|
||||
|
||||
//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);
|
||||
|
||||
//下
|
||||
tCol col;
|
||||
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1);
|
||||
s_RenderSystem.Clear();
|
||||
for (i=0;i<PANEL_MAX;i++){
|
||||
if ((s_Panel[i].visible) && (s_Panel[i].scr != 0)){
|
||||
if (s_Panel[i].enable==false){
|
||||
col.r = s_Panel[i].style.color.r;
|
||||
col.g = s_Panel[i].style.color.g;
|
||||
col.b = s_Panel[i].style.color.b;
|
||||
ColorFromCode(COLOR_GRAY,&s_Panel[i].style.color);
|
||||
}
|
||||
//drawBox(s_Panel[i].pos,s_Panel[i].size,&s_Panel[i].style,s_Panel[i].caption);
|
||||
drawBox2(s_Panel[i].pos,s_Panel[i].size,&s_Panel[i].style,s_Panel[i].caption);
|
||||
if (s_Panel[i].enable==false){
|
||||
s_Panel[i].style.color.r = col.r;
|
||||
s_Panel[i].style.color.g = col.g;
|
||||
s_Panel[i].style.color.b = col.b;
|
||||
}
|
||||
}
|
||||
}
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
nngxWaitVSync(NN_GX_DISPLAY1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void ColorFromCode(eColor c,tCol *col)
|
||||
{
|
||||
switch(c){
|
||||
case COLOR_BLACK:
|
||||
col->r = 0.0;
|
||||
col->g = 0.0;
|
||||
col->b = 0.0;
|
||||
break;
|
||||
case COLOR_GRAY:
|
||||
col->r = 0.5f;
|
||||
col->g = 0.5f;
|
||||
col->b = 0.5f;
|
||||
break;
|
||||
case COLOR_RED:
|
||||
col->r = 1.0f;
|
||||
col->g = 0.0f;
|
||||
col->b = 0.0f;
|
||||
break;
|
||||
case COLOR_BLUE:
|
||||
col->r = 0.0f;
|
||||
col->g = 0.0f;
|
||||
col->b = 1.0f;
|
||||
break;
|
||||
case COLOR_GREEN:
|
||||
col->r = 0.0f;
|
||||
col->g = 1.0f;
|
||||
col->b = 0.0f;
|
||||
break;
|
||||
case COLOR_YELLO:
|
||||
col->r = 1.0f;
|
||||
col->g = 1.0f;
|
||||
col->b = 0.0f;
|
||||
break;
|
||||
case COLOR_WHITE:
|
||||
col->r = 1.0f;
|
||||
col->g = 1.0f;
|
||||
col->b = 1.0f;
|
||||
break;
|
||||
case COLOR_PARPL:
|
||||
col->r = 1.0f;
|
||||
col->g = 0.0f;
|
||||
col->b = 1.0f;
|
||||
break;
|
||||
case COLOR_SKY:
|
||||
col->r = 0.5f;
|
||||
col->g = 1.0f;
|
||||
col->b = 1.0f;
|
||||
break;
|
||||
default:
|
||||
col->r = 1.0f;
|
||||
col->g = 1.0f;
|
||||
col->b = 1.0f;
|
||||
break;
|
||||
}
|
||||
col->a = 1.0f;
|
||||
}
|
||||
|
||||
//------------------ class code ----------------------------
|
||||
|
||||
nn::os::Thread s_thread;
|
||||
|
||||
//thread
|
||||
//void Gui::thUpdate()
|
||||
void thUpdate(nn::os::LightEvent* pEvnt)
|
||||
{
|
||||
nn::hid::PadReader padReader;
|
||||
nn::hid::PadStatus padStatus;
|
||||
nn::hid::TouchPanelStatus tpStatus;
|
||||
tU16xy tpOld = {0,0};
|
||||
nn::hid::TouchPanelReader tpReader;
|
||||
u32 value;
|
||||
int i;
|
||||
|
||||
while(1)
|
||||
{
|
||||
if (pEvnt->TryWait())break;
|
||||
|
||||
if (s_Button.enable && (s_Button.callback !=0))//PADボタン
|
||||
{
|
||||
padReader.ReadLatest(&padStatus);
|
||||
value = (padStatus.trigger & s_Button.mask) | ((padStatus.hold & s_Button.mask) << 16);
|
||||
if (value)(*s_Button.callback)(value);
|
||||
}
|
||||
|
||||
tpReader.ReadLatest(&tpStatus);//タッチ
|
||||
if((tpStatus.x != tpOld.x) || (tpStatus.y != tpOld.y))
|
||||
{
|
||||
tpOld.x = tpStatus.x;
|
||||
tpOld.y = tpStatus.y;
|
||||
if (tpStatus.touch)
|
||||
{
|
||||
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))
|
||||
{
|
||||
if(onPanel(tpStatus.x,tpStatus.y,&s_Panel[i]))
|
||||
(*s_Panel[i].callback)(tpStatus.x | (tpStatus.y<<16));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nn::os::Thread::Yield();//MAINスレッドへ
|
||||
}
|
||||
nn::hid::Finalize();
|
||||
pEvnt->ClearSignal();
|
||||
}
|
||||
|
||||
|
||||
Gui::~Gui()
|
||||
{
|
||||
Finalize();
|
||||
}
|
||||
|
||||
|
||||
//初期化、終了
|
||||
bool Gui::Initialize(uptr pHeap,u32 size,nn::os::LightEvent* pEvnt)
|
||||
{
|
||||
if (Initialized)return false;
|
||||
Initialized = true;
|
||||
|
||||
//コンポーネントの初期化
|
||||
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< MESS_MAX;i++)MessEffective(i,false,false);
|
||||
|
||||
//Render
|
||||
s_RenderSystem.Initialize(pHeap, size);
|
||||
|
||||
SharedFontInit();
|
||||
|
||||
//HID
|
||||
nn::hid::Initialize();
|
||||
|
||||
//Thread
|
||||
NN_LOG("Thread Start\n");
|
||||
nn::Result res =s_thread.TryStartUsingAutoStack(thUpdate,pEvnt,8192);
|
||||
if (res.IsFailure()){
|
||||
NN_LOG("failed :res.desc = %d\n",res.GetDescription());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Gui::Finalize()
|
||||
{
|
||||
if (Initialized != true) return;
|
||||
if (s_thread.IsAlive())
|
||||
{
|
||||
s_thread.Join();
|
||||
s_thread.Finalize();
|
||||
}
|
||||
Initialized = false;
|
||||
//nn::hid::Finalize();
|
||||
// nngxFinalize 関数呼び出しと VSync 割り込みが同時に発生すると
|
||||
// 画面が暗転したまま止まる不具合を回避するために VSync 待ちを行う
|
||||
nngxWaitVSync(NN_GX_DISPLAY_BOTH);
|
||||
SharedFontFinalize();
|
||||
nngxWaitVSync(NN_GX_DISPLAY_BOTH);
|
||||
s_RenderSystem.Finalize();
|
||||
|
||||
}
|
||||
|
||||
void Gui::ButtonCallback(uptr adrs)
|
||||
{
|
||||
s_Button.SetCallback(adrs);
|
||||
}
|
||||
|
||||
void Gui::ButtonMask(u32 mask)
|
||||
{
|
||||
s_Button.mask = mask;
|
||||
s_Button.enable = true;
|
||||
}
|
||||
|
||||
myResult Gui::PanelSet(const tPanel *panel)
|
||||
{
|
||||
if (panel->id >= PANEL_MAX)return RESULT_BAD_PARAM;
|
||||
s_Panel[panel->id].pos.x = panel->x;
|
||||
s_Panel[panel->id].pos.y = panel->y;
|
||||
s_Panel[panel->id].size.x = panel->width;
|
||||
s_Panel[panel->id].size.y = panel->height;
|
||||
//if (panel->caption[0] != 0 )
|
||||
s_Panel[panel->id].caption = panel->caption;
|
||||
s_Panel[panel->id].SetCallback(panel->callback);
|
||||
s_Panel[panel->id].scr = panel->scr;
|
||||
s_Panel[panel->id].visible = false;
|
||||
s_Panel[panel->id].enable = false;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
myResult Gui::PanelEffective(u8 id,bool enable,bool visible)
|
||||
{
|
||||
if (id >= PANEL_MAX)return RESULT_BAD_PARAM;
|
||||
s_Panel[id].enable = enable;
|
||||
s_Panel[id].visible = visible;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
myResult Gui::PanelLineStyle(u8 id,eColor col,u8 width)
|
||||
{
|
||||
if (id >= PANEL_MAX)return RESULT_BAD_PARAM;
|
||||
ColorFromCode(col,&s_Panel[id].style.color);
|
||||
s_Panel[id].style.width = width;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
|
||||
myResult Gui::MessEffective(u8 id,bool enable,bool visible)
|
||||
{
|
||||
if (id >= MESS_MAX)return RESULT_BAD_PARAM;
|
||||
s_Message[id].enable = enable;
|
||||
s_Message[id].visible = visible;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
|
||||
myResult Gui::MessSet(const tMessage *mes)
|
||||
{
|
||||
if ((mes->parent >= PANEL_MAX) || (mes->id >= MESS_MAX))return RESULT_BAD_PARAM;
|
||||
s_Message[mes->id].pos.x = mes->x;
|
||||
s_Message[mes->id].pos.y = mes->y;
|
||||
s_Message[mes->id].caption = mes->str;
|
||||
s_Message[mes->id].parent = mes->parent;
|
||||
s_Message[mes->id].style.width = mes->size;
|
||||
ColorFromCode(mes->color,&s_Message[mes->id].style.color);
|
||||
s_Message[mes->id].visible = false;
|
||||
s_Message[mes->id].enable = false;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
myResult Gui::MessStr(u8 id,char *str)
|
||||
{
|
||||
if (id >= MESS_MAX)return RESULT_BAD_PARAM;
|
||||
s_Message[id].caption = str;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
myResult Gui::MessCol(u8 id,eColor col)
|
||||
{
|
||||
if (id >= MESS_MAX)return RESULT_BAD_PARAM;
|
||||
ColorFromCode(col,&s_Message[id].style.color);
|
||||
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()
|
||||
{
|
||||
//s_drawFlag = true;
|
||||
drawDisp();
|
||||
}
|
||||
|
||||
|
||||
void Gui::DisableAll()
|
||||
{
|
||||
for (int i=0;i<PANEL_MAX;i++){
|
||||
s_Panel[i].enable = false;
|
||||
s_Panel[i].visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
End of file
|
||||
*---------------------------------------------------------------------------*/
|
||||
@ -1,95 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef GUI_H_
|
||||
#define GUI_H_
|
||||
|
||||
#include <nn/os.h>
|
||||
#include <nn/types.h>
|
||||
#include "../my_defs.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uptr callback;
|
||||
char* caption;
|
||||
u16 x,y;
|
||||
u16 width,height;
|
||||
u16 id;
|
||||
u16 scr;//0:up,else down screen
|
||||
}tPanel;
|
||||
|
||||
typedef enum {
|
||||
COLOR_BLACK,
|
||||
COLOR_GRAY,
|
||||
COLOR_RED,
|
||||
COLOR_GREEN,
|
||||
COLOR_BLUE,
|
||||
COLOR_YELLO,
|
||||
COLOR_WHITE,
|
||||
COLOR_PARPL,
|
||||
COLOR_SKY
|
||||
}eColor;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char* str;
|
||||
u16 x,y;//親の始点との相対
|
||||
eColor color;//
|
||||
u8 size;//文字サイズ
|
||||
u8 id;
|
||||
u8 parent;//親コンポーネント指定
|
||||
}tMessage;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 lines;//表示行数
|
||||
u16 x,y;//親の始点との相対
|
||||
eColor color;//文字色
|
||||
u8 size;//文字サイズ
|
||||
u8 id;
|
||||
u8 parent;//親コンポーネント指定
|
||||
}tMemo;
|
||||
|
||||
|
||||
|
||||
class Gui
|
||||
{
|
||||
private:
|
||||
bool Initialized;
|
||||
|
||||
public:
|
||||
Gui(){};
|
||||
~Gui();
|
||||
bool Initialize(uptr pHeap,u32 size,nn::os::LightEvent* pEvnt);
|
||||
void Finalize();
|
||||
void ButtonCallback(uptr adrs);
|
||||
void ButtonMask(u32 mask);
|
||||
myResult PanelSet(const tPanel *panel);
|
||||
myResult MessSet(const tMessage *mes);
|
||||
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 MessCol(u8 id,eColor col);
|
||||
myResult MemoStr(u8 id,char *str,u16 ln);
|
||||
myResult PanelLineStyle(u8 id,eColor col=COLOR_WHITE,u8 width = 2);
|
||||
//void thUpdate();
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,92 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef MYDEFS_H_
|
||||
#define MYDEFS_H_
|
||||
|
||||
//デバグモード有効化
|
||||
//#define DEBUG_ENABLE 1
|
||||
|
||||
//リストア成功時消去
|
||||
#define SUCCESS_DELETE 1
|
||||
|
||||
//SD使用時
|
||||
//#define BKUP_NOTMEM 1
|
||||
|
||||
//データ壊すモード有効
|
||||
//#define CRUSH_ENABLE 1
|
||||
|
||||
|
||||
//エラー表示コード
|
||||
enum {
|
||||
ERC_UNKNOWN = 0, //不明
|
||||
ERC_DEVICE, //デバイスが見つからない(カード抜け)
|
||||
ERC_PRODCODE,//プロダクトコード不一致
|
||||
ERC_VERIFI,//ベリファイエラー
|
||||
ERC_PATH,//パスが長すぎ
|
||||
ERC_DIRDEPTH,//ディレクトリ深すぎ
|
||||
ERC_MEDIA, //メディアが見つからない(サブ基盤外れなど)
|
||||
//ERC_PULLOUT,//抜け検出
|
||||
ERC_READ = 10, //ファイルが見つからない
|
||||
ERC_WRITE_OW = 20, //既に存在
|
||||
ERC_WRITE_NS, //空き容量がない
|
||||
ERC_WRITE_PROTECT, //書込み禁止
|
||||
ERC_ACCESS = 30, //アクセスエラー
|
||||
ERC_FORMAT = 50, //フォーマットエラー
|
||||
ERC_SDK_VERIFI = 60, //検証に失敗、改竄
|
||||
ERC_ROM = 70, //ROM情報エラー
|
||||
ERC_RETRY = 80, //リトライ要求
|
||||
ERC_EXEC = 90, //実行時エラー
|
||||
ERC_FATAL = 99 //深刻なエラー
|
||||
};
|
||||
|
||||
typedef enum{
|
||||
ERC_DEV_CARD = 100,
|
||||
ERC_DEV_OUT = 200,
|
||||
ERC_DEV_OTHER = 300
|
||||
}ErcDev;
|
||||
|
||||
|
||||
//内部使用のエラー
|
||||
typedef enum {
|
||||
RESULT_OK,
|
||||
RESULT_FAIL,
|
||||
RESULT_FAIL_OPEN,
|
||||
RESULT_FAIL_OPENW,
|
||||
RESULT_FAIL_DELETE,
|
||||
RESULT_FAIL_CREATE,
|
||||
RESULT_FAIL_READ,
|
||||
RESULT_FAIL_WRITE,
|
||||
RESULT_FAIL_MOUNT,
|
||||
RESULT_FAIL_FORMAT,
|
||||
RESULT_FAIL_GETDIR,
|
||||
RESULT_NOT_FAUND,
|
||||
RESULT_NO_MEDIA,
|
||||
RESULT_NOT_FORMAT,
|
||||
RESULT_BAD_FORMAT,
|
||||
RESULT_SDK_VERIFI,
|
||||
RESULT_FILE_EXIST,
|
||||
RESULT_NO_EXSAVE,
|
||||
RESULT_ALREADY_MOUNT,
|
||||
RESULT_INVALID_FILE,
|
||||
RESULT_BAD_PARAM,
|
||||
RESULT_DIR_LEVEL_OVER,
|
||||
RESULT_PATH_LENGTH_OVER,
|
||||
RESULT_MAX
|
||||
}myResult;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,301 +0,0 @@
|
||||
#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";//暫定
|
||||
#define PATHLENGTH_MAX_EX 512
|
||||
wchar_t expath_w[PATHLENGTH_MAX_EX];//パス名
|
||||
wchar_t expathu_w[100][PATHLENGTH_MAX_EX];//上層パス名
|
||||
wchar_t expathw_w[PATHLENGTH_MAX_EX];//パス名ワーク
|
||||
#define MAX_LEVEL_EX 128
|
||||
static nn::fs::DirectoryEntry exdcEntry[MAX_LEVEL_EX];
|
||||
static nn::fs::Directory exdc[MAX_LEVEL_EX];
|
||||
|
||||
|
||||
//拡張セーブデータ
|
||||
//存在確認
|
||||
bool ExSave::IsExist()
|
||||
{
|
||||
LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID);
|
||||
nn::fs::Unmount(exsaveName);
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
|
||||
//パス検索位置のリセット
|
||||
void ExSave::ResetPath()
|
||||
{
|
||||
s_lv=0;
|
||||
s_serch = false;
|
||||
wcscpy(expath_w,exsaveRoot_w);
|
||||
//wcscpy(expathu_w,expath_w);
|
||||
}
|
||||
|
||||
|
||||
myResult ExSave::GetPath(wchar_t *path)
|
||||
{
|
||||
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_EX)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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//削除
|
||||
bool ExSave::Delete()
|
||||
{
|
||||
LastNnResult = nn::fs::DeleteExtSaveData(OWN_UID);
|
||||
//if (nn::fs::ResultNotFound().Includes(LastNnResult))return RESULT_NOT_FOUND;
|
||||
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()
|
||||
{
|
||||
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));
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//ライト属性ファイルを開く
|
||||
bool ExSave::OpenW(wchar_t *path,s64 size)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
//コンストラクタ
|
||||
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);
|
||||
}
|
||||
|
||||
void ExSave::Finalize()
|
||||
{
|
||||
Close();
|
||||
Unmount();
|
||||
}
|
||||
//デストラクタ
|
||||
ExSave::~ExSave()
|
||||
{
|
||||
Finalize();
|
||||
}
|
||||
|
||||
@ -1,70 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef EXSAVE_H_
|
||||
#define EXSAVE_H_
|
||||
|
||||
#include <nn/types.h>
|
||||
#include <nn/Result.h>
|
||||
#include "../my_defs.h"
|
||||
#include "savefile.h"
|
||||
|
||||
class ExSave
|
||||
{
|
||||
public:
|
||||
s64 FileSize;
|
||||
nn::Result LastNnResult;
|
||||
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;
|
||||
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 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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,228 +0,0 @@
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <nn/fs.h>
|
||||
#include <nn/fs/fs_ResultPrivate.h>
|
||||
#include "membak.h"
|
||||
|
||||
using namespace nn;
|
||||
|
||||
namespace
|
||||
{
|
||||
const size_t BUFFER_SIZE = 10 * 1024 * 1024;
|
||||
bit8 s_Buffer[BUFFER_SIZE] NN_ATTRIBUTE_ALIGN(32);
|
||||
}
|
||||
|
||||
bool info_alive;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
|
||||
|
||||
//コンストラクタ
|
||||
MemBak::MemBak()
|
||||
{
|
||||
m_Exists = false;
|
||||
m_pBuffer = s_Buffer;
|
||||
m_pBufferPos = s_Buffer;
|
||||
m_pBufferSize = sizeof(s_Buffer);
|
||||
LastNnResult = ResultSuccess();
|
||||
ResetPath();
|
||||
|
||||
info_alive = false;
|
||||
}
|
||||
|
||||
void MemBak::Finalize()
|
||||
{
|
||||
}
|
||||
//デストラクタ
|
||||
MemBak::~MemBak()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// mount, unmount, create, delete
|
||||
|
||||
//拡張セーブデータ
|
||||
//存在確認
|
||||
bool MemBak::IsExist()
|
||||
{
|
||||
return m_Exists;
|
||||
}
|
||||
|
||||
//セーブ作成、成功時はマウント状態
|
||||
myResult MemBak::Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile)
|
||||
{
|
||||
NN_UNUSED_VAR(icon);
|
||||
NN_UNUSED_VAR(iconSize);
|
||||
|
||||
if ( m_IsMounted )
|
||||
{
|
||||
return RESULT_ALREADY_MOUNT;
|
||||
}
|
||||
|
||||
m_NumDirEntry = entryDir;
|
||||
m_NumFileEntry = entryFile;
|
||||
|
||||
m_Exists = true;
|
||||
m_IsMounted = true;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
//削除
|
||||
bool MemBak::Delete()
|
||||
{
|
||||
m_Exists = false;
|
||||
info_alive = false;
|
||||
m_pBufferPos = m_pBuffer;
|
||||
return true;
|
||||
}
|
||||
|
||||
//マウント
|
||||
myResult MemBak::Mount()
|
||||
{
|
||||
if ( m_IsMounted )
|
||||
{
|
||||
return RESULT_ALREADY_MOUNT;
|
||||
}
|
||||
|
||||
m_IsMounted = true;
|
||||
return RESULT_OK;
|
||||
}
|
||||
void MemBak::Unmount()
|
||||
{
|
||||
m_IsMounted = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// SetInfo, GetInfo
|
||||
|
||||
//アーカイブ情報の取得
|
||||
bool MemBak::GetInfo(tArcInfo *pinfo)
|
||||
{
|
||||
if (info_alive==false)return false;
|
||||
*pinfo = m_ArcInfo;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//管理用ファイル
|
||||
//ライト属性で開く
|
||||
bool MemBak::OpenSysW()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
//ライト属性ファイルを閉じる
|
||||
void MemBak::CloseSysW()
|
||||
{
|
||||
}
|
||||
|
||||
//システムファイルライト
|
||||
bool MemBak::WriteSys(tArcInfo *pinfo)
|
||||
{
|
||||
info_alive = true;
|
||||
pinfo->Ver = INFO_VERSION;
|
||||
m_ArcInfo = *pinfo;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Traverse
|
||||
|
||||
//パス検索位置のリセット
|
||||
void MemBak::ResetPath()
|
||||
{
|
||||
m_pFind = reinterpret_cast<EntryHeader*>(m_pBuffer);
|
||||
}
|
||||
|
||||
|
||||
myResult MemBak::GetPath(wchar_t *path)
|
||||
{
|
||||
if( m_pFind->IsEnd() )
|
||||
{
|
||||
path[0] = '\0';
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
std::wcscpy(path, m_pFind->GetName());
|
||||
m_pFind = m_pFind->GetNext();
|
||||
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Write
|
||||
|
||||
//ライト属性ファイルを閉じる
|
||||
void MemBak::CloseW()
|
||||
{
|
||||
}
|
||||
|
||||
//ファイルライト
|
||||
s32 MemBak::Write(char *buffer,size_t size)
|
||||
{
|
||||
return m_ForWrite.Write(buffer, size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//ライト属性ファイルを開く
|
||||
bool MemBak::OpenW(wchar_t *path,s64 size)
|
||||
{
|
||||
m_ForWrite.Init(reinterpret_cast<EntryHeader*>(m_pBufferPos));
|
||||
m_ForWrite.Set(path, size);
|
||||
m_pBufferPos = reinterpret_cast<bit8*>(m_ForWrite.GetNext());
|
||||
return true;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Read
|
||||
|
||||
//ファイルリード
|
||||
s32 MemBak::Read(char *buffer,size_t size)
|
||||
{
|
||||
return m_ForRead.Read(buffer, size);
|
||||
}
|
||||
|
||||
|
||||
void MemBak::Close()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//ファイルを開く
|
||||
//パス指定はルート以降
|
||||
//(ex)data:/dir/file -> dir/file
|
||||
bool MemBak::Open(wchar_t *path)
|
||||
{
|
||||
EntryHeader* pE = reinterpret_cast<EntryHeader*>(m_pBuffer);
|
||||
|
||||
while( ! pE->IsEnd() )
|
||||
{
|
||||
if( pE->Match(path) )
|
||||
{
|
||||
m_ForRead.Init(pE);
|
||||
FileSize = m_ForRead.GetSize();
|
||||
return true;
|
||||
}
|
||||
|
||||
pE = pE->GetNext();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
@ -1,189 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef MEMBAK_H_
|
||||
#define MEMBAK_H_
|
||||
|
||||
#include <nn/types.h>
|
||||
#include <nn/Result.h>
|
||||
#include "../my_defs.h"
|
||||
#include "savefile.h"
|
||||
#include <nn/math.h>
|
||||
|
||||
class MemBak
|
||||
{
|
||||
public:
|
||||
s64 FileSize;
|
||||
NN_PADDING4;
|
||||
nn::Result LastNnResult;
|
||||
private:
|
||||
struct EntryHeader
|
||||
{
|
||||
s16 nameSize;
|
||||
NN_PADDING2;
|
||||
s32 dataSize;
|
||||
s32 nextOffset;
|
||||
|
||||
EntryHeader* GetNext()
|
||||
{
|
||||
return reinterpret_cast<EntryHeader*>(
|
||||
reinterpret_cast<bit8*>(this) + nextOffset);
|
||||
}
|
||||
bit8* GetDataPointer()
|
||||
{
|
||||
return reinterpret_cast<bit8*>(this + 1) + nameSize;
|
||||
}
|
||||
const wchar_t* GetName() const
|
||||
{
|
||||
return reinterpret_cast<const wchar_t*>(
|
||||
reinterpret_cast<const bit8*>(this + 1));
|
||||
}
|
||||
void SetName(const wchar_t* name)
|
||||
{
|
||||
s32 len = std::wcslen(name);
|
||||
nameSize = len * 2 + 2;
|
||||
std::memcpy(this + 1, name, nameSize);
|
||||
}
|
||||
void SetSize(size_t size)
|
||||
{
|
||||
dataSize = size;
|
||||
}
|
||||
s32 GetSize() const
|
||||
{
|
||||
return dataSize;
|
||||
}
|
||||
void SetNext()
|
||||
{
|
||||
nextOffset = nn::math::RoundUp(sizeof(*this) + nameSize + dataSize, 4);
|
||||
}
|
||||
bool Match(const wchar_t* p)
|
||||
{
|
||||
return std::wcscmp(p, GetName()) == 0;
|
||||
}
|
||||
bool IsEnd() const
|
||||
{
|
||||
return nameSize == 0;
|
||||
}
|
||||
};
|
||||
struct FileState
|
||||
{
|
||||
EntryHeader* pE;
|
||||
s32 pos;
|
||||
|
||||
void Init(EntryHeader* p)
|
||||
{
|
||||
pE = p;
|
||||
pos = 0;
|
||||
}
|
||||
void Set(const wchar_t* name, size_t size)
|
||||
{
|
||||
pE->SetName(name);
|
||||
pE->SetSize(size);
|
||||
pE->SetNext();
|
||||
pE->GetNext()->nameSize = 0;
|
||||
}
|
||||
s32 GetSize() const { return pE->GetSize(); }
|
||||
EntryHeader* GetNext()
|
||||
{
|
||||
return pE->GetNext();
|
||||
}
|
||||
bit8* GetCurrentPointer()
|
||||
{
|
||||
return pE->GetDataPointer() + pos;
|
||||
}
|
||||
s32 GetRemain() const
|
||||
{
|
||||
return pE->dataSize - pos;
|
||||
}
|
||||
void Advance(s32 size)
|
||||
{
|
||||
pos += size;
|
||||
}
|
||||
s32 Write(const void* p, size_t size)
|
||||
{
|
||||
s32 remain = GetRemain();
|
||||
if( remain <= 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 copySize = nn::math::Min<s32>(remain, size);
|
||||
std::memcpy(GetCurrentPointer(), p, copySize);
|
||||
Advance(copySize);
|
||||
|
||||
return copySize;
|
||||
}
|
||||
s32 Read(void* p, size_t size)
|
||||
{
|
||||
s32 remain = GetRemain();
|
||||
if( remain <= 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 copySize = nn::math::Min<s32>(remain, size);
|
||||
std::memcpy(p, GetCurrentPointer(), copySize);
|
||||
Advance(copySize);
|
||||
|
||||
return copySize;
|
||||
}
|
||||
};
|
||||
|
||||
tArcInfo m_ArcInfo;
|
||||
FileState m_ForRead;
|
||||
FileState m_ForWrite;
|
||||
|
||||
bool m_Exists;
|
||||
bool m_IsMounted;
|
||||
NN_PADDING2;
|
||||
bit8* m_pBuffer;
|
||||
size_t m_pBufferSize;
|
||||
bit8* m_pBufferPos;
|
||||
EntryHeader* m_pFind;
|
||||
|
||||
u32 m_NumDirEntry;
|
||||
u32 m_NumFileEntry;
|
||||
|
||||
public:
|
||||
MemBak();
|
||||
~MemBak();
|
||||
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 Delete();
|
||||
void CloseW();
|
||||
bool OpenW(wchar_t *path,s64 size);
|
||||
bool OpenSysW();//Žb’è
|
||||
void CloseSysW();//Žb’è
|
||||
// bool OpenSysR();//Žb’è
|
||||
// void CloseSysR();//Žb’è
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,445 +0,0 @@
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <nn/fs.h>
|
||||
#include "savedata.h"
|
||||
#include <nn/fs/fs_ResultPrivate.h>
|
||||
//#include <../fs/fs_ApiSysSaveData.h>
|
||||
//#include <../fs/ctr/mpcore/fs_FileSystemBasePrivate.h>
|
||||
#include <nn/fs/CTR/MPCore/fs_ApiForHwCheck.h>
|
||||
#include <nn/am/am_ApiSystemMenu.h>
|
||||
#include <nn/am/am_ApiLocalImporter.h>
|
||||
|
||||
#define MAX_LEVEL 256
|
||||
//static nn::fs::DirectoryEntry dcEntry[MAX_LEVEL];
|
||||
//static nn::fs::Directory dc[MAX_LEVEL];
|
||||
int dc_readed[MAX_LEVEL];//リード済みエントリ数
|
||||
|
||||
//生成時のデバイス名を超えるとパス長上限をこえる
|
||||
//可能性があるので1文字にする(無用な心配かも)
|
||||
const wchar_t *sdataRoot_w = L"s:/";
|
||||
#define ROOTLENGTH 3
|
||||
const char *sdataName = "s:";
|
||||
const wchar_t *Dummy_w = L"ncltool";
|
||||
//char path[512];//パス名
|
||||
static bool IsMounted;
|
||||
wchar_t path_w[MAX_PATH_LENGTH];//パス名
|
||||
wchar_t pathu_w[MAX_LEVEL][MAX_PATH_LENGTH];//パス名履歴
|
||||
wchar_t pathw_w[MAX_PATH_LENGTH];//パス名ワーク
|
||||
|
||||
//#define SysSaveId 0x20300
|
||||
|
||||
//セーブ作成、成功時はマウント状態
|
||||
myResult SaveData::Format(tArcInfo *pinfo)
|
||||
{
|
||||
if ( IsMounted )return RESULT_ALREADY_MOUNT;
|
||||
#ifdef USE_SYS_SAVE
|
||||
LastNnResult = nn::fs::CreateSystemSaveData(
|
||||
SysSaveId,pinfo->FileEntry,pinfo->DirEntry,0x100000,pinfo->Dup);
|
||||
if (LastNnResult.IsFailure())return RESULT_FAIL_FORMAT;
|
||||
#else
|
||||
LastNnResult = nn::fs::FormatCtrCardSaveData(pinfo->FileEntry,pinfo->DirEntry,pinfo->Dup);
|
||||
if (LastNnResult.IsFailure())return RESULT_FAIL_FORMAT;
|
||||
#endif
|
||||
if ( Mount() != RESULT_OK )return RESULT_FAIL_MOUNT;
|
||||
IsMounted = true;
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
void SaveData::ResetPath()
|
||||
{
|
||||
s_lv=0;
|
||||
s_serch = false;
|
||||
wcscpy(path_w,sdataRoot_w);
|
||||
for (int n = 0;n<MAX_LEVEL;n++)dc_readed[n] = 0;
|
||||
//wcscpy(pathu_w,path_w);
|
||||
}
|
||||
|
||||
myResult SaveData::GetPath(wchar_t *path)
|
||||
{
|
||||
static nn::fs::DirectoryEntry dcEntryl;
|
||||
static nn::fs::Directory dcl;
|
||||
|
||||
int n,ct;
|
||||
while(1){
|
||||
LastNnResult = dcl.TryInitialize(path_w);//Open
|
||||
if (LastNnResult.IsFailure()){
|
||||
return RESULT_FAIL;
|
||||
}
|
||||
if (dc_readed[s_lv] != 0)for(n=0;n<dc_readed[s_lv];n++)dcl.Read(&dcEntryl,1);
|
||||
n = (dcl.Read(&dcEntryl,1));
|
||||
dc_readed[s_lv]++;
|
||||
dcl.Finalize();
|
||||
if ( n==0 )//終端
|
||||
{
|
||||
if (s_lv == 0){path[0]=0;return RESULT_OK;}// ---- rootなら終了
|
||||
s_lv--;//上の層に戻る
|
||||
wcscpy(path_w,pathu_w[s_lv]);//パス戻す
|
||||
}else{
|
||||
if(dcEntryl.attributes.isDirectory){//ディレクトリ
|
||||
//m_info.DirCount++;
|
||||
wcscpy(pathu_w[s_lv],path_w);//パス保存
|
||||
wcscat(path_w,dcEntryl.entryName);//次のディレクトリパス
|
||||
wcscat(path_w,L"/");
|
||||
if (++s_lv == MAX_LEVEL)return RESULT_DIR_LEVEL_OVER;
|
||||
}else{//ファイル
|
||||
//m_info.FileCount++;
|
||||
wcscpy(path,pPathTop);
|
||||
ct =wcslen(path) + wcslen(dcEntryl.entryName);
|
||||
if (ct>MAX_PATH_LENGTH - 1)return RESULT_PATH_LENGTH_OVER;
|
||||
wcscat(path,dcEntryl.entryName);
|
||||
return RESULT_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//アンマウント
|
||||
void SaveData::Unmount()
|
||||
{
|
||||
if(IsMounted){
|
||||
IsMounted = false;
|
||||
nn::fs::Unmount(sdataName);
|
||||
}
|
||||
}
|
||||
|
||||
//バックアップの存在チェック
|
||||
myResult SaveData::IsExist(){
|
||||
myResult res;
|
||||
res = Mount();
|
||||
Unmount();
|
||||
return res;
|
||||
}
|
||||
/*
|
||||
//アーカイブ情報の取得
|
||||
bool SaveData::GetInfo(tArcInfo *pinfo)
|
||||
{
|
||||
|
||||
//strcpy(path,readerRoot);
|
||||
s_lv=0;
|
||||
m_info.DirCount = 0;
|
||||
m_info.FileCount = 0;
|
||||
m_info.DirEntry = 0;
|
||||
m_info.FileEntry = 0;
|
||||
m_info.Dup = false;
|
||||
wcscpy(path_w,sdataRoot_w);
|
||||
//wcscpy(pathu_w,path_w);
|
||||
|
||||
int n;
|
||||
int lv = 0;
|
||||
bool cont = true;
|
||||
while(cont){
|
||||
LastNnResult = dc[lv].TryInitialize(path_w);//Open
|
||||
if (LastNnResult.IsFailure())return false;
|
||||
while(1){
|
||||
n = (dc[lv].Read(&dcEntry[lv],1));
|
||||
if ( n==0 )//終端
|
||||
{
|
||||
dc[lv].Finalize();
|
||||
if (lv == 0){cont=false;break;}// ---- 終了
|
||||
lv--;//上の層に戻る
|
||||
wcscpy(path_w,pathu_w[lv]);//パス戻す
|
||||
}else{
|
||||
if(dcEntry[lv].attributes.isDirectory){//ディレクトリ
|
||||
m_info.DirCount++;
|
||||
wcscpy(pathu_w[lv],path_w);//パス保存
|
||||
wcscat(path_w,dcEntry[lv].entryName);//次のディレクトリパス
|
||||
wcscat(path_w,L"/");
|
||||
if (++lv == MAX_LEVEL)return false;
|
||||
break;
|
||||
}else{//ファイル
|
||||
m_info.FileCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef INFO_API_USE
|
||||
//アーカイブのエントリ数
|
||||
// .. APIまでの暫定
|
||||
m_info.DirEntry = m_info.DirCount;
|
||||
m_info.FileEntry = m_info.FileCount;
|
||||
#else
|
||||
//API使用
|
||||
#ifdef USE_SYS_SAVE
|
||||
size_t sz;
|
||||
LastNnResult = nn::fs::GetSystemSaveDataFormatInfo(SysSaveId, &m_info.FileEntry, &m_info.DirEntry, &sz, &m_info.Dup);
|
||||
#else
|
||||
//LastNnResult = nn::fs::GetSaveDataFormatInfo(&m_info.FileEntry,&m_info.DirEntry,&m_info.Dup);
|
||||
LastNnResult = nn::fs::GetCtrCardSaveDataFormatInfo(&m_info.FileEntry,&m_info.DirEntry,&m_info.Dup);
|
||||
#endif
|
||||
if (LastNnResult.IsFailure())return false;
|
||||
|
||||
#endif
|
||||
|
||||
*pinfo = m_info;//構造体コピー
|
||||
return true;
|
||||
|
||||
}
|
||||
*/
|
||||
//アーカイブ情報の取得
|
||||
bool SaveData::GetInfo(tArcInfo *pinfo)
|
||||
{
|
||||
static nn::fs::DirectoryEntry dcEntryl;
|
||||
static nn::fs::Directory dcl;
|
||||
|
||||
//strcpy(path,readerRoot);
|
||||
s_lv=0;
|
||||
m_info.DirCount = 0;
|
||||
m_info.FileCount = 0;
|
||||
m_info.DirEntry = 0;
|
||||
m_info.FileEntry = 0;
|
||||
m_info.Dup = false;
|
||||
wcscpy(path_w,sdataRoot_w);
|
||||
//wcscpy(pathu_w,path_w);
|
||||
|
||||
int n;
|
||||
int lv = 0;
|
||||
for (n = 0;n<MAX_LEVEL;n++)dc_readed[n] = 0;
|
||||
bool cont = true;
|
||||
while(cont){
|
||||
LastNnResult = dcl.TryInitialize(path_w);//Open
|
||||
if (LastNnResult.IsFailure())return false;
|
||||
if (dc_readed[lv] != 0)for(n=0;n<dc_readed[lv];n++)dcl.Read(&dcEntryl,1);
|
||||
while(1){
|
||||
n = (dcl.Read(&dcEntryl,1));
|
||||
dc_readed[lv]++;
|
||||
if ( n==0 )//終端
|
||||
{
|
||||
if (lv == 0){cont=false;break;}// ---- 終了
|
||||
lv--;//上の層に戻る
|
||||
wcscpy(path_w,pathu_w[lv]);//パス戻す
|
||||
break;
|
||||
}else{
|
||||
if(dcEntryl.attributes.isDirectory){//ディレクトリ
|
||||
m_info.DirCount++;
|
||||
wcscpy(pathu_w[lv],path_w);//パス保存
|
||||
wcscat(path_w,dcEntryl.entryName);//次のディレクトリパス
|
||||
wcscat(path_w,L"/");
|
||||
if (++lv == MAX_LEVEL)return false;
|
||||
break;
|
||||
}else{//ファイル
|
||||
m_info.FileCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
dcl.Finalize();
|
||||
}
|
||||
for (n = 0;n<MAX_LEVEL;n++)dc_readed[n] = 0;
|
||||
|
||||
#ifndef INFO_API_USE
|
||||
//アーカイブのエントリ数
|
||||
// .. APIまでの暫定
|
||||
m_info.DirEntry = m_info.DirCount;
|
||||
m_info.FileEntry = m_info.FileCount;
|
||||
#else
|
||||
//API使用
|
||||
#ifdef USE_SYS_SAVE
|
||||
size_t sz;
|
||||
LastNnResult = nn::fs::GetSystemSaveDataFormatInfo(SysSaveId, &m_info.FileEntry, &m_info.DirEntry, &sz, &m_info.Dup);
|
||||
#else
|
||||
//LastNnResult = nn::fs::GetSaveDataFormatInfo(&m_info.FileEntry,&m_info.DirEntry,&m_info.Dup);
|
||||
LastNnResult = nn::fs::GetCtrCardSaveDataFormatInfo(&m_info.FileEntry,&m_info.DirEntry,&m_info.Dup);
|
||||
#endif
|
||||
if (LastNnResult.IsFailure())return false;
|
||||
|
||||
#endif
|
||||
|
||||
*pinfo = m_info;//構造体コピー
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//プロダクトコード
|
||||
//結果は PrdCord に格納
|
||||
bool SaveData::GetPrdCode()
|
||||
{
|
||||
PrdCode[0] = 0;//clear
|
||||
s32 numPrograms;
|
||||
nn::ProgramId programId;
|
||||
|
||||
LastNnResult = nn::am::InitializeForLocalImporter();
|
||||
//LastNnResult = nn::am::InitializeForSystemMenu();
|
||||
if (LastNnResult.IsFailure()){
|
||||
//NN_LOG("%d",LastNnResult.GetDescription());
|
||||
//nn::am::FinalizeForSystemMenu();
|
||||
nn::am::FinalizeForLocalImporter();
|
||||
return false;
|
||||
}
|
||||
LastNnResult = nn::am::GetProgramList(&numPrograms, &programId, 1, nn::fs::MEDIA_TYPE_CTRCARD);
|
||||
if (LastNnResult.IsFailure()){
|
||||
//NN_LOG("%d",LastNnResult.GetDescription());
|
||||
//nn::am::FinalizeForSystemMenu();
|
||||
nn::am::FinalizeForLocalImporter();
|
||||
return false;
|
||||
}
|
||||
LastNnResult = nn::am::GetProductCode( (nn::ProductCode*)&PrdCode,nn::fs::MEDIA_TYPE_CTRCARD,programId);
|
||||
//nn::am::FinalizeForSystemMenu();
|
||||
nn::am::FinalizeForLocalImporter();
|
||||
PrdCode[sizeof(nn::ProductCode)] = 0;//表示時のオーバラン対策
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
|
||||
//マウント&アーカイブ情報の取得
|
||||
myResult SaveData::Mount()
|
||||
{
|
||||
if (IsMounted)return RESULT_ALREADY_MOUNT;
|
||||
|
||||
#ifdef USE_SYS_SAVE
|
||||
LastNnResult=nn::fs::MountSystemSaveData(sdataName,SysSaveId);
|
||||
#else
|
||||
//LastNnResult=nn::fs::MountSaveDataOnCard(sdataName);//FileSystemBasePrivate
|
||||
LastNnResult = nn::fs::MountCtrCardSaveDataForCheck(sdataName);//ApiForHwCheck
|
||||
#endif
|
||||
IsMounted = LastNnResult.IsSuccess();
|
||||
if (IsMounted)return RESULT_OK;
|
||||
if (nn::fs::ResultMediaNotFound().Includes(LastNnResult))return RESULT_NO_MEDIA;
|
||||
if (nn::fs::ResultFatNotFound().Includes(LastNnResult))return RESULT_NOT_FAUND;//書けるのか?
|
||||
if (nn::fs::ResultNotFormatted().Includes(LastNnResult))return RESULT_NOT_FORMAT;
|
||||
if (nn::fs::ResultBadFormat().Includes(LastNnResult))return RESULT_BAD_FORMAT;
|
||||
if (nn::fs::ResultVerificationFailed().Includes(LastNnResult))return RESULT_SDK_VERIFI;
|
||||
|
||||
return RESULT_FAIL;
|
||||
}
|
||||
|
||||
//システムセーブのデリート
|
||||
//API実装までのテスト用データを消す用
|
||||
#ifdef USE_SYS_SAVE
|
||||
void SaveData::Delete()
|
||||
{
|
||||
LastNnResult=nn::fs::DeleteSystemSaveData(SysSaveId);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//ファイルリード
|
||||
s32 SaveData::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 SaveData::Close()
|
||||
{
|
||||
reader.Finalize();
|
||||
}
|
||||
|
||||
void SaveData::CloseW()
|
||||
{
|
||||
writer.Finalize();
|
||||
}
|
||||
|
||||
//ファイルを開く
|
||||
//パス指定はルート以降
|
||||
//(ex)data:/dir/file -> dir/file
|
||||
bool SaveData::Open(wchar_t *path)
|
||||
{
|
||||
wcscpy(pathw_w,sdataRoot_w);
|
||||
wcscat(pathw_w,path);
|
||||
LastNnResult = reader.TryInitialize(pathw_w);
|
||||
if (LastNnResult.IsSuccess())
|
||||
{
|
||||
LastNnResult = reader.TryGetSize(&FileSize);
|
||||
if (LastNnResult.IsSuccess())return true;
|
||||
else Close();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SaveData::OpenW(wchar_t *path,s64 size,bool *mkdir)
|
||||
{
|
||||
int pos,pos2;
|
||||
|
||||
wcscpy(path_w,sdataRoot_w);
|
||||
wcscat(path_w,path);
|
||||
*mkdir = false;
|
||||
//while(1){
|
||||
LastNnResult = nn::fs::TryCreateFile(path_w,size);
|
||||
if(LastNnResult.IsSuccess())
|
||||
{
|
||||
LastNnResult = writer.TryInitialize(path_w,false);
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
//ディレクトリがなければディレクトリを作成
|
||||
pos = GetPosDelmLast(path_w,ROOTLENGTH);//ファイルが存在するディレクトリ
|
||||
if (pos <= 0)return false;//rootかパスが不正
|
||||
//while (1){
|
||||
wcscpy(pathw_w,path_w);//ワークにコピー
|
||||
while (LastNnResult.IsFailure()){//ディレクトリ作成できるまで遡る
|
||||
if(LastNnResult.GetDescription()!=nn::fs::DESCRIPTION_DBM_DIRECTORY_NOT_FOUND)return false;
|
||||
pos2 = GetPosDelmLast(pathw_w,ROOTLENGTH);//境界位置を探す
|
||||
if (pos2 == 0)return false;//root到達
|
||||
pathw_w[pos2] = 0;//境界まで削除 (例) dir1/dir2/file -> dir1/dir2 -> dir1
|
||||
LastNnResult = nn::fs::TryCreateDirectory(pathw_w);
|
||||
}
|
||||
//作成ディレクトリ多いと画面止まるので、作成ごとに抜ける
|
||||
*mkdir = true; // 帰値:false で mkdir=true ならディレクトリ作成のみ
|
||||
return false;
|
||||
//if (pos2 == pos)break;//配置ディレクトリなら抜ける
|
||||
//todo:ディレクトリが深いとき時間がかかるなら、無駄なTryCreateを省く
|
||||
//案)直上から最初の成功までのデリミタ位置を記録
|
||||
//先に全ディレクトリ作っておくのがよさげ
|
||||
//}
|
||||
//}
|
||||
//LastNnResult = writer.TryInitialize(path_w,false);
|
||||
//return LastNnResult.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
//ファイルライト
|
||||
s32 SaveData::Write(char *buffer,size_t size)
|
||||
{
|
||||
s32 ct;
|
||||
LastNnResult = writer.TryWrite(&ct,(void*)buffer,size);
|
||||
if(LastNnResult.IsFailure())ct=0;
|
||||
return ct;
|
||||
}
|
||||
|
||||
//コミット
|
||||
bool SaveData::Commit()
|
||||
{
|
||||
#ifdef USE_SYS_SAVE
|
||||
LastNnResult=nn::fs::CommitSystemSaveData(sdataName);
|
||||
#else
|
||||
LastNnResult=nn::fs::CommitSaveData(sdataName);
|
||||
#endif
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//コンストラクタ
|
||||
SaveData::SaveData()
|
||||
{
|
||||
IsMounted = false;
|
||||
s_lv=0;
|
||||
PrdCode[0] = 0;
|
||||
m_info.DirCount = 0;
|
||||
m_info.FileCount = 0;
|
||||
m_info.DirEntry = 0;
|
||||
m_info.FileEntry = 0;
|
||||
wcscpy(path_w,sdataRoot_w);
|
||||
//wcscpy(pathu_w,path_w);
|
||||
pPathTop = (wchar_t*)((u32)&path_w+strlen(sdataName)*2+2);
|
||||
|
||||
}
|
||||
|
||||
void SaveData::Finalize()
|
||||
{
|
||||
Close();
|
||||
Unmount();
|
||||
}
|
||||
//デストラクタ
|
||||
SaveData::~SaveData()
|
||||
{
|
||||
Finalize();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef SAVEDATA_H_
|
||||
#define SAVEDATA_H_
|
||||
|
||||
#include <nn/types.h>
|
||||
#include <nn/Result.h>
|
||||
//#include <nn/am/am_ApiSystemMenu.h>
|
||||
#include "../my_defs.h"
|
||||
#include "savefile.h"
|
||||
|
||||
#define MAX_PATH_LENGTH 512
|
||||
|
||||
class SaveData
|
||||
{
|
||||
public:
|
||||
s64 FileSize;
|
||||
nn::Result LastNnResult;
|
||||
char PrdCode[20];
|
||||
private:
|
||||
nn::fs::FileReader reader;
|
||||
nn::fs::FileWriter writer;
|
||||
int s_lv;
|
||||
wchar_t *pPathTop;
|
||||
tArcInfo m_info;
|
||||
bool s_serch;
|
||||
u8 pad[3];//padding
|
||||
public:
|
||||
SaveData();
|
||||
~SaveData();
|
||||
myResult Mount();
|
||||
void Unmount();
|
||||
myResult GetPath(wchar_t *path);
|
||||
void ResetPath();
|
||||
bool Open(wchar_t *path);
|
||||
void Finalize();
|
||||
void Close();
|
||||
void CloseW();
|
||||
s32 Read(char *buffer,size_t size);
|
||||
myResult IsExist();
|
||||
bool GetInfo(tArcInfo *pinfo);
|
||||
myResult Format(tArcInfo *pinfo);
|
||||
bool OpenW(wchar_t *path,s64 size,bool *mkdir);
|
||||
s32 Write(char *buffer,size_t size);
|
||||
bool Commit();
|
||||
bool GetPrdCode();
|
||||
#ifdef USE_SYS_SAVE
|
||||
void Delete();
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,18 +0,0 @@
|
||||
//共通関数
|
||||
|
||||
#include "savefile.h"
|
||||
|
||||
//終端から前方検索で見つかった境界("/"=0x2f)位置を返す
|
||||
//top :検索範囲の先頭指定
|
||||
int GetPosDelmLast(wchar_t *s,int top)
|
||||
{
|
||||
size_t i = wcslen(s);
|
||||
if (i < top)return -1;
|
||||
if (i ==top)return 0;
|
||||
i--;
|
||||
while(i > top-1){
|
||||
if (s[i]==L'/')return i;
|
||||
i--;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -1,35 +0,0 @@
|
||||
#ifndef SAVEFILE_H_
|
||||
#define SAVEFILE_H_
|
||||
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <nn/types.h>
|
||||
|
||||
//API使用してアーカイブ情報を取得
|
||||
#define INFO_API_USE 1
|
||||
|
||||
//カードの変わりにシステムセーブを使用(API対応までの暫定)
|
||||
//#define USE_SYS_SAVE 1
|
||||
|
||||
//SD保存
|
||||
//#define BKUP_NOTMEM 1
|
||||
|
||||
int GetPosDelmLast(wchar_t *s,int top);
|
||||
|
||||
//情報ファイルのバージョン
|
||||
#define INFO_VERSION 1
|
||||
|
||||
//SDバックアップに同梱する情報
|
||||
//変更の際は後方互換とれるよう追加のみとする
|
||||
typedef struct{
|
||||
u32 DirEntry,FileEntry;
|
||||
u32 DirCount,FileCount;
|
||||
bool Dup;
|
||||
u8 Ver;//バージョン
|
||||
char Pcode[20];//product code save,exsaveクラスのPrdCodeサイズを下回らないこと
|
||||
u8 padding[3];//パディング
|
||||
}tArcInfo;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,793 +0,0 @@
|
||||
#include <nn.h>
|
||||
#include <stdio.h>
|
||||
#include "screen.h"
|
||||
#include "../my_defs.h"
|
||||
#include "../common/ver.h"
|
||||
|
||||
|
||||
Gui gui;
|
||||
u8 scr_evnt;
|
||||
|
||||
enum{
|
||||
//PANEL_END,
|
||||
PANEL_ERROR,
|
||||
PANEL_SUCCESS,
|
||||
PANEL_TOPMENU,
|
||||
PANEL_TITLE,
|
||||
PANEL_QUIT,
|
||||
PANEL_READ,
|
||||
PANEL_WRITE,
|
||||
PANEL_YES,
|
||||
PANEL_NO,
|
||||
PANEL_CONFIRM,
|
||||
PANEL_DELCONF,
|
||||
PANEL_MENU,
|
||||
PANEL_BKUP,
|
||||
PANEL_INSEXIT,
|
||||
PANEL_DBGLOG
|
||||
};
|
||||
|
||||
enum{
|
||||
MESSAGE_VERSION,
|
||||
MESSAGE_PRODUCT,
|
||||
MESSAGE_PRODUCT2,
|
||||
MESSAGE_ERROR_TITLE,
|
||||
MESSAGE_ERROR_INFO,
|
||||
MESSAGE_ERROR_INFO2,
|
||||
MESSAGE_ERROR_INFO3,
|
||||
MESSAGE_SUCCESS_TITLE,
|
||||
MESSAGE_SUCCESS_INFO,
|
||||
MESSAGE_SUCCESS_INFO2,
|
||||
MESSAGE_CONFIRM_TITLE,
|
||||
MESSAGE_CONFIRM_MSG,
|
||||
MESSAGE_DELCONF_TITLE,
|
||||
MESSAGE_DELCONF_MSG,
|
||||
MESSAGE_DELCONF_MSG2,
|
||||
MESSAGE_DELCONF_MSG3,
|
||||
//MESSAGE_TOPMENU_HELP_TITLE,
|
||||
MESSAGE_TOPMENU_HELP_READ,
|
||||
MESSAGE_TOPMENU_HELP_WRITE,
|
||||
MESSAGE_TOPMENU_HELP_END,
|
||||
MESSAGE_TOPMENU_HELP_OPERATE,
|
||||
MESSAGE_TITLE,
|
||||
MESSAGE_MENU_READ,
|
||||
MESSAGE_MENU_WRITE,
|
||||
//MESSAGE_MENU_END,
|
||||
MESSAGE_MENU_OPERATE,
|
||||
MESSAGE_MENU_CAUTION,
|
||||
MESSAGE_MENU_ERROR,
|
||||
MESSAGE_MENU_DEBUG,
|
||||
MESSAGE_INSEXT_1,
|
||||
MESSAGE_INSEXT_2,
|
||||
MESSAGE_INSEXT_3,
|
||||
MESSAGE_OPERATE,
|
||||
MESSAGE_RESULT,
|
||||
MESSAGE_QUIT_OPERATE,
|
||||
MESSAGE_CONF,
|
||||
MESSAGE_COUNT,
|
||||
MESSAGE_COUNT2,
|
||||
MESSAGE_STATUS
|
||||
};
|
||||
|
||||
enum{
|
||||
MEMO_DBGLOG
|
||||
};
|
||||
|
||||
|
||||
//画面消去、コンポーネントをディセーブル
|
||||
void ScrClr()
|
||||
{
|
||||
gui.ButtonMask(0);
|
||||
gui.DisableAll();
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
nn::os::Tick holdTck;
|
||||
u32 holdVal;
|
||||
//---------------------------------イベントコールバック
|
||||
//----------------PADボタン
|
||||
void pushButton(u32 sts)
|
||||
{
|
||||
//NN_LOG("button > %4x\n",button);
|
||||
u32 trg = sts & 0x0ffff;
|
||||
u32 hld = sts >> 16;
|
||||
/*
|
||||
if (holdVal)//同時押し猶予期間
|
||||
{
|
||||
if (nn::fnd::TimeSpan::FromMilliSeconds(100) > (nn::os::Tick::GetSystemCurrent()-holdTck)){
|
||||
holdVal |= trg;
|
||||
if (holdVal == nn::hid::BUTTON_LEFT | holdVal & nn::hid::BUTTON_X ){
|
||||
holdVal = 0;
|
||||
scr_evnt = EVNT_PUSH_LEFT_X;
|
||||
}
|
||||
}else holdVal = 0;
|
||||
}else if( (holdVal = trg & (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X ))>0)
|
||||
{//一定時間どっちかのボタン押し維持
|
||||
holdTck = nn::os::Tick::GetSystemCurrent();
|
||||
}
|
||||
*/
|
||||
|
||||
if( holdVal )//押し続け判定
|
||||
{
|
||||
if (hld != holdVal)
|
||||
{
|
||||
holdVal = 0;
|
||||
}else
|
||||
if (nn::fnd::TimeSpan::FromMilliSeconds(4000) < (nn::os::Tick::GetSystemCurrent()-holdTck))
|
||||
{
|
||||
holdVal = 0;
|
||||
scr_evnt = EVNT_PUSH_LEFT_X;
|
||||
}
|
||||
}else if (hld == ( nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X ))
|
||||
{
|
||||
holdVal = hld;
|
||||
holdTck = nn::os::Tick::GetSystemCurrent();
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_ENABLE
|
||||
else if (hld & nn::hid::BUTTON_DOWN)//同時押し
|
||||
{
|
||||
if (hld & nn::hid::BUTTON_Y)
|
||||
if (hld & nn::hid::BUTTON_X)
|
||||
scr_evnt = EVNT_PUSH_DOWN_Y;
|
||||
}
|
||||
else if (trg & nn::hid::BUTTON_R)scr_evnt = EVNT_PUSH_R;
|
||||
else if (trg & nn::hid::BUTTON_L)scr_evnt = EVNT_PUSH_L;
|
||||
#endif
|
||||
#ifdef ENABLE_CRUSH
|
||||
else if (trg & nn::hid::BUTTON_Y)scr_evnt = EVNT_PUSH_Y;
|
||||
#endif
|
||||
else if (trg & nn::hid::BUTTON_B)scr_evnt = EVNT_PUSH_B;
|
||||
}
|
||||
|
||||
//-----------------パネルをタッチ
|
||||
// ---- Top Menu :READ
|
||||
void touchRead(u32 pos NN_IS_UNUSED_VAR)
|
||||
{
|
||||
scr_evnt = EVNT_SEL_READ;
|
||||
}
|
||||
// ---- Top Menu :WRITE
|
||||
void touchWrite(u32 pos NN_IS_UNUSED_VAR)
|
||||
{
|
||||
scr_evnt = EVNT_SEL_WRITE;
|
||||
}
|
||||
|
||||
//---- Top Menu :END
|
||||
//void touchEnd(u32 pos NN_IS_UNUSED_VAR)
|
||||
//{
|
||||
// scr_evnt = EVNT_SEL_END;
|
||||
//}
|
||||
|
||||
//---- YES
|
||||
void touchYes(u32 pos NN_IS_UNUSED_VAR)
|
||||
{
|
||||
scr_evnt = EVNT_YES;
|
||||
}
|
||||
|
||||
//---- NO
|
||||
void touchNo(u32 pos NN_IS_UNUSED_VAR)
|
||||
{
|
||||
scr_evnt = EVNT_NO;
|
||||
}
|
||||
|
||||
void touchQuit(u32 pos NN_IS_UNUSED_VAR)
|
||||
{
|
||||
scr_evnt = EVNT_QUIT;
|
||||
}
|
||||
|
||||
#define NULL_PTR 0
|
||||
#define NULL_STR 0
|
||||
#define SCREEN_UPPER 0
|
||||
#define SCREEN_LOWER 1
|
||||
#define LOC_CONF_X 60
|
||||
#define LOC_CONF_Y 20
|
||||
#define LOC_CONF_W (400 - LOC_CONF_X*2)
|
||||
#define LOC_CONF_H 70
|
||||
#define LOC_LOG_X 50
|
||||
#define LOC_LOG_W (400 - LOC_LOG_X*2)
|
||||
#define LOC_LOG_Y (LOC_CONF_Y + LOC_CONF_H + 10)
|
||||
#define LOC_LOG_H (240 - LOC_LOG_Y - 10)
|
||||
#define LOG_MAX 10
|
||||
|
||||
// -------------------------------------------------- コンポーネント設計
|
||||
//下画面
|
||||
|
||||
//Top Menu
|
||||
const tPanel panel_Read = {(uptr)touchRead,"Backup",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};
|
||||
|
||||
//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};
|
||||
|
||||
//上画面
|
||||
//デバグ用
|
||||
//エラー表示
|
||||
const tPanel panel_Error = {NULL_PTR,NULL_STR,LOC_CONF_X,LOC_CONF_Y,LOC_CONF_W,LOC_CONF_H,PANEL_ERROR,SCREEN_UPPER};
|
||||
const tMessage mess_Title_Err = {"title",10,10,COLOR_RED,8,MESSAGE_ERROR_TITLE,PANEL_ERROR};
|
||||
const tMessage mess_Info_Err = {"info",10,22,COLOR_RED,8,MESSAGE_ERROR_INFO,PANEL_ERROR};
|
||||
const tMessage mess_Info2_Err = {"info2",10,40,COLOR_RED,8,MESSAGE_ERROR_INFO2,PANEL_ERROR};
|
||||
const tMessage mess_Info3_Err = {"info3",10,50,COLOR_RED,8,MESSAGE_ERROR_INFO3,PANEL_ERROR};
|
||||
|
||||
//成功
|
||||
const tPanel panel_Success = {NULL_PTR,NULL_STR,LOC_CONF_X,LOC_CONF_Y,LOC_CONF_W,LOC_CONF_H,PANEL_SUCCESS,SCREEN_UPPER};
|
||||
const tMessage mess_Title_Suc = {"title",10,10,COLOR_GREEN,8,MESSAGE_SUCCESS_TITLE,PANEL_SUCCESS};
|
||||
const tMessage mess_Info_Suc = {"info",10,40,COLOR_WHITE,8,MESSAGE_SUCCESS_INFO,PANEL_SUCCESS};
|
||||
const tMessage mess_Info2_Suc = {"info2",10,50,COLOR_WHITE,8,MESSAGE_SUCCESS_INFO2,PANEL_SUCCESS};
|
||||
|
||||
//実行確認
|
||||
const tPanel panel_Confirm = {NULL_PTR,NULL_STR,LOC_CONF_X,LOC_CONF_Y,LOC_CONF_W,LOC_CONF_H,PANEL_CONFIRM,SCREEN_UPPER};
|
||||
const tMessage mess_conf_Title = {"title",10,10,COLOR_YELLO,8,MESSAGE_CONFIRM_TITLE,PANEL_CONFIRM};
|
||||
const tMessage mess_conf_Msg = {"Do you execute?",10,40,COLOR_WHITE,8,MESSAGE_CONFIRM_MSG,PANEL_CONFIRM};
|
||||
|
||||
//トップメニュー
|
||||
const tPanel panel_topmenu_help = {NULL_PTR,NULL_STR,LOC_CONF_X,LOC_CONF_Y,LOC_CONF_W,LOC_CONF_H,PANEL_TOPMENU,SCREEN_UPPER};
|
||||
const tMessage mess_topmenu_help_read = {"[Backup] Card -> bkup",10,4,COLOR_WHITE,8,MESSAGE_TOPMENU_HELP_READ,PANEL_TOPMENU};
|
||||
const tMessage mess_topmenu_help_notread = {"[Backup] is Invalid",10,4,COLOR_RED,8,MESSAGE_TOPMENU_HELP_READ,PANEL_TOPMENU};
|
||||
const tMessage mess_topmenu_help_write = {"[Restore] bkup -> Card",10,16,COLOR_WHITE,8,MESSAGE_TOPMENU_HELP_WRITE,PANEL_TOPMENU};
|
||||
const tMessage mess_topmenu_help_notwrite = {"[Restore] is Invalid",10,16,COLOR_RED,8,MESSAGE_TOPMENU_HELP_WRITE,PANEL_TOPMENU};
|
||||
const tMessage mess_topmenu_help_end = {"[End] return to SystemMenu",10,28,COLOR_WHITE,8,MESSAGE_TOPMENU_HELP_END,PANEL_TOPMENU};
|
||||
const tMessage mess_topmenu_help_operate = {"touch below",10,48,COLOR_GREEN,8,MESSAGE_TOPMENU_HELP_OPERATE,PANEL_TOPMENU};
|
||||
|
||||
//ログ表示
|
||||
const tPanel panel_dbglog = {NULL_PTR,NULL_STR,LOC_LOG_X,LOC_LOG_Y,LOC_LOG_W,LOC_LOG_H,PANEL_DBGLOG,SCREEN_UPPER};
|
||||
const tMemo memo_dbglog = {LOG_MAX,10,10,COLOR_WHITE,8,MEMO_DBGLOG,PANEL_DBGLOG};
|
||||
|
||||
|
||||
//通常時
|
||||
//タイトル
|
||||
#define FONT_SIZE_TITLE 12
|
||||
#define LOC_TITL_X (40-FONT_SIZE_TITLE*2)
|
||||
#define LOC_TITL_Y 20
|
||||
#define LOC_TITL_W (400 - LOC_CONF_X*2)
|
||||
#define LOC_TITL_H 50
|
||||
#define FONT_SIZE_PRODUCT 10
|
||||
const tPanel panel_title = {NULL_PTR,NULL_STR,LOC_TITL_X,LOC_TITL_Y,LOC_TITL_W,LOC_TITL_H,PANEL_TITLE,SCREEN_UPPER};
|
||||
const tMessage mess_title = {"title",0,0,COLOR_WHITE,FONT_SIZE_TITLE,MESSAGE_TITLE,PANEL_TITLE};
|
||||
const tMessage mess_product = {"product",0,LOC_TITL_H - 22,COLOR_WHITE,FONT_SIZE_PRODUCT,MESSAGE_PRODUCT,PANEL_TITLE};
|
||||
const tMessage mess_product2 = {"product2",0,LOC_TITL_H - 10,COLOR_WHITE,FONT_SIZE_PRODUCT,MESSAGE_PRODUCT2,PANEL_TITLE};
|
||||
const tMessage mess_version = {"version",LOC_TITL_W-FONT_SIZE_PRODUCT*6,FONT_SIZE_TITLE+2,COLOR_WHITE,FONT_SIZE_PRODUCT,MESSAGE_VERSION,PANEL_TITLE};
|
||||
|
||||
#define LOC_MESS_X 20
|
||||
#define LOC_MESS_W (400 - LOC_MESS_X*2)
|
||||
#define LOC_MESS_Y (LOC_TITL_Y + LOC_TITL_H + 10)
|
||||
#define LOC_MESS_H (240 - LOC_MESS_Y - 10)
|
||||
//TOPメニュー
|
||||
//情報表示はログと排他
|
||||
#define FONT_SIZE 10
|
||||
#define STR_LINE(ln) (FONT_SIZE + 2)*ln
|
||||
const tPanel panel_menu = {NULL_PTR,NULL_STR,LOC_MESS_X,LOC_MESS_Y,LOC_MESS_W,LOC_MESS_H,PANEL_MENU,SCREEN_UPPER};
|
||||
const tMessage mess_menu_read = {"[Backup] Card savedata Backup",10,STR_LINE(1),COLOR_WHITE,FONT_SIZE,MESSAGE_MENU_READ,PANEL_MENU};
|
||||
const tMessage mess_menu_write = {"[Restore] restore to Card",10,STR_LINE(2),COLOR_WHITE,FONT_SIZE,MESSAGE_MENU_WRITE,PANEL_MENU};
|
||||
//const tMessage mess_menu_end = {"[End] close this apprication",10,STR_LINE(3),COLOR_WHITE,FONT_SIZE,MESSAGE_MENU_END,PANEL_MENU};
|
||||
const tMessage mess_menu_operate = {"touch below",10,STR_LINE(4),COLOR_GREEN,FONT_SIZE,MESSAGE_MENU_OPERATE,PANEL_MENU};
|
||||
const tMessage mess_bkuperr = {"Backup error",10,STR_LINE(6),COLOR_RED,FONT_SIZE,MESSAGE_MENU_ERROR,PANEL_MENU};
|
||||
const tMessage mess_carderr = {"CARD error",10,STR_LINE(7),COLOR_YELLO,FONT_SIZE,MESSAGE_MENU_CAUTION,PANEL_MENU};
|
||||
const tMessage mess_debug = {"Crush Mode",10,STR_LINE(3),COLOR_YELLO,FONT_SIZE,MESSAGE_MENU_DEBUG,PANEL_MENU};
|
||||
|
||||
//Backup
|
||||
//const tPanel panel_bkup = {NULL_PTR,NULL_STR,LOC_LOG_X,LOC_LOG_Y,LOC_LOG_W,LOC_LOG_H,PANEL_BKUP,SCREEN_UPPER};
|
||||
const tPanel panel_bkup = {NULL_PTR,NULL_STR,LOC_MESS_X,LOC_MESS_Y,LOC_MESS_W,LOC_MESS_H,PANEL_BKUP,SCREEN_UPPER};
|
||||
const tMessage mess_quit_operate = {"touch [Quit],or Push B",10,STR_LINE(4),COLOR_SKY,FONT_SIZE,MESSAGE_QUIT_OPERATE,PANEL_BKUP};
|
||||
const tMessage mess_conf = {"Do you execute?",10,STR_LINE(2),COLOR_WHITE,FONT_SIZE,MESSAGE_CONF,PANEL_BKUP};
|
||||
const tMessage mess_result = {"result",10,STR_LINE(2),COLOR_WHITE,FONT_SIZE,MESSAGE_RESULT,PANEL_BKUP};
|
||||
const tMessage mess_operate = {"touch below",10,STR_LINE(4),COLOR_GREEN,FONT_SIZE,MESSAGE_OPERATE,PANEL_BKUP};
|
||||
const tMessage mess_status = {"status",10,STR_LINE(7),COLOR_WHITE,FONT_SIZE,MESSAGE_STATUS,PANEL_BKUP};
|
||||
const tMessage mess_count = {"count",10,STR_LINE(8),COLOR_WHITE,FONT_SIZE,MESSAGE_COUNT,PANEL_BKUP};
|
||||
const tMessage mess_count2 = {"count2",10,STR_LINE(9),COLOR_GREEN,FONT_SIZE,MESSAGE_COUNT2,PANEL_BKUP};
|
||||
|
||||
|
||||
//挿抜発生時
|
||||
//const tPanel panel_insexit = {NULL_PTR,NULL_STR,LOC_LOG_X,LOC_LOG_Y,LOC_LOG_W,LOC_LOG_H,PANEL_INSEXIT,SCREEN_UPPER};
|
||||
const tPanel panel_insexit = {NULL_PTR,NULL_STR,LOC_MESS_X,LOC_MESS_Y,LOC_MESS_W,LOC_MESS_H,PANEL_INSEXIT,SCREEN_UPPER};
|
||||
const tMessage mess_insexit = {"device insert or pull out is detected",10,STR_LINE(3),COLOR_RED,8,MESSAGE_INSEXT_1,PANEL_INSEXIT};
|
||||
const tMessage mess_insexit2 = {"return to top menu",10,STR_LINE(5),COLOR_WHITE,8,MESSAGE_INSEXT_2,PANEL_INSEXIT};
|
||||
const tMessage mess_insexit3 = {"please touch or push B",10,STR_LINE(6),COLOR_WHITE,8,MESSAGE_INSEXT_3,PANEL_INSEXIT};
|
||||
|
||||
//削除確認
|
||||
//const tPanel panel_delconf = {NULL_PTR,NULL_STR,LOC_CONF_X-10,LOC_CONF_Y,LOC_CONF_W+10,LOC_CONF_H*2,PANEL_DELCONF,SCREEN_UPPER};
|
||||
const tPanel panel_delconf = {NULL_PTR,NULL_STR,LOC_MESS_X,LOC_MESS_Y-36,LOC_MESS_W,LOC_MESS_H,PANEL_DELCONF,SCREEN_UPPER};
|
||||
const tMessage mess_delconf_Title = {" *** DELETE *** ",10,10,COLOR_YELLO,16,MESSAGE_DELCONF_TITLE,PANEL_DELCONF};
|
||||
const tMessage mess_delconf_Msg = {" caution!",10,50,COLOR_YELLO,12,MESSAGE_DELCONF_MSG,PANEL_DELCONF};
|
||||
const tMessage mess_delconf_Msg2 = {"this is delete backup",10,70,COLOR_YELLO,12,MESSAGE_DELCONF_MSG2,PANEL_DELCONF};
|
||||
const tMessage mess_delconf_Msg3 = {"Do you execute?",10,90,COLOR_YELLO,12,MESSAGE_DELCONF_MSG3,PANEL_DELCONF};
|
||||
|
||||
|
||||
|
||||
nn::os::LightEvent stopEvnt(true);
|
||||
|
||||
char scr_ver[16];
|
||||
char scr_err[32];
|
||||
char scr_debug[32];
|
||||
//menu
|
||||
bool ScrInitialize(uptr heap,u32 size)
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
holdVal = 0;
|
||||
holdTck = nn::fnd::TimeSpan(0);
|
||||
|
||||
if (gui.Initialize(heap,size,&stopEvnt)==false)return false;
|
||||
|
||||
gui.ButtonCallback((uptr)pushButton);
|
||||
//コンポーネント登録
|
||||
gui.PanelSet(&panel_Read);
|
||||
gui.PanelSet(&panel_Write);
|
||||
// gui.PanelSet(&panel_End);
|
||||
gui.PanelSet(&panel_Yes);
|
||||
gui.PanelSet(&panel_No);
|
||||
gui.PanelSet(&panel_Quit);
|
||||
gui.PanelSet(&panel_Error);
|
||||
gui.PanelSet(&panel_Success);
|
||||
gui.PanelSet(&panel_Confirm);
|
||||
gui.PanelSet(&panel_delconf);
|
||||
gui.PanelSet(&panel_topmenu_help);
|
||||
gui.PanelSet(&panel_title);
|
||||
gui.PanelSet(&panel_menu);
|
||||
gui.PanelSet(&panel_bkup);
|
||||
gui.PanelSet(&panel_dbglog);
|
||||
gui.PanelSet(&panel_insexit);
|
||||
|
||||
gui.PanelLineStyle(PANEL_TITLE,COLOR_BLACK);
|
||||
|
||||
|
||||
gui.MessSet(&mess_Title_Err);
|
||||
gui.MessSet(&mess_Info_Err);
|
||||
gui.MessSet(&mess_Info2_Err);
|
||||
gui.MessSet(&mess_Info3_Err);
|
||||
gui.MessSet(&mess_Title_Suc);
|
||||
gui.MessSet(&mess_Info_Suc);
|
||||
gui.MessSet(&mess_Info2_Suc);
|
||||
gui.MessSet(&mess_conf_Title);
|
||||
gui.MessSet(&mess_conf_Msg);
|
||||
gui.MessSet(&mess_delconf_Title);
|
||||
gui.MessSet(&mess_delconf_Msg);
|
||||
gui.MessSet(&mess_delconf_Msg2);
|
||||
gui.MessSet(&mess_delconf_Msg3);
|
||||
|
||||
gui.MessSet(&mess_topmenu_help_read);
|
||||
gui.MessSet(&mess_topmenu_help_write);
|
||||
gui.MessSet(&mess_topmenu_help_end);
|
||||
gui.MessSet(&mess_topmenu_help_operate);
|
||||
|
||||
gui.MessSet(&mess_title);
|
||||
gui.MessSet(&mess_version);
|
||||
gui.MessSet(&mess_product);
|
||||
gui.MessSet(&mess_product2);
|
||||
gui.MessSet(&mess_menu_read);
|
||||
gui.MessSet(&mess_menu_write);
|
||||
// gui.MessSet(&mess_menu_end);
|
||||
gui.MessSet(&mess_menu_operate);
|
||||
gui.MessSet(&mess_quit_operate);
|
||||
gui.MessSet(&mess_conf);
|
||||
gui.MessSet(&mess_operate);
|
||||
gui.MessSet(&mess_bkuperr);
|
||||
gui.MessSet(&mess_carderr);
|
||||
gui.MessSet(&mess_debug);
|
||||
gui.MessSet(&mess_result);
|
||||
gui.MessSet(&mess_status);
|
||||
gui.MessSet(&mess_count);
|
||||
gui.MessSet(&mess_count2);
|
||||
|
||||
gui.MessSet(&mess_insexit);
|
||||
gui.MessSet(&mess_insexit2);
|
||||
gui.MessSet(&mess_insexit3);
|
||||
|
||||
gui.MemoSet(&memo_dbglog);
|
||||
|
||||
gui.MemoEffective(MESSAGE_PRODUCT);
|
||||
gui.MessEffective(MESSAGE_ERROR_TITLE);
|
||||
gui.MessEffective(MESSAGE_ERROR_INFO);
|
||||
gui.MessEffective(MESSAGE_ERROR_INFO2);
|
||||
gui.MessEffective(MESSAGE_ERROR_INFO3);
|
||||
gui.MessEffective(MESSAGE_SUCCESS_TITLE);
|
||||
gui.MessEffective(MESSAGE_SUCCESS_INFO);
|
||||
gui.MessEffective(MESSAGE_SUCCESS_INFO2);
|
||||
gui.MessEffective(MESSAGE_CONFIRM_TITLE);
|
||||
gui.MessEffective(MESSAGE_CONFIRM_MSG);
|
||||
gui.MessEffective(MESSAGE_DELCONF_TITLE);
|
||||
gui.MessEffective(MESSAGE_DELCONF_MSG);
|
||||
gui.MessEffective(MESSAGE_DELCONF_MSG2);
|
||||
gui.MessEffective(MESSAGE_DELCONF_MSG3);
|
||||
gui.MessEffective(MESSAGE_TOPMENU_HELP_READ);
|
||||
gui.MessEffective(MESSAGE_TOPMENU_HELP_WRITE);
|
||||
gui.MessEffective(MESSAGE_TOPMENU_HELP_END);
|
||||
gui.MessEffective(MESSAGE_TOPMENU_HELP_OPERATE);
|
||||
gui.MessEffective(MESSAGE_MENU_READ);
|
||||
gui.MessEffective(MESSAGE_MENU_WRITE);
|
||||
// gui.MessEffective(MESSAGE_MENU_END);
|
||||
gui.MessEffective(MESSAGE_MENU_OPERATE);
|
||||
gui.MessEffective(MESSAGE_INSEXT_1);
|
||||
gui.MessEffective(MESSAGE_INSEXT_2);
|
||||
gui.MessEffective(MESSAGE_INSEXT_3);
|
||||
gui.MessEffective(MESSAGE_TITLE);
|
||||
gui.MessEffective(MESSAGE_VERSION);
|
||||
gui.MemoEffective(MEMO_DBGLOG);
|
||||
|
||||
gui.PanelLineStyle(PANEL_DELCONF,COLOR_YELLO);
|
||||
|
||||
sprintf(scr_ver,"ver %.2f",VERSION);
|
||||
gui.MessStr(MESSAGE_VERSION,scr_ver);
|
||||
gui.MessStr(MESSAGE_MENU_CAUTION,scr_err);
|
||||
gui.MessStr(MESSAGE_MENU_ERROR,scr_err);
|
||||
gui.MessStr(MESSAGE_MENU_DEBUG,scr_debug);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void ScrFinalize()
|
||||
{
|
||||
stopEvnt.Signal();
|
||||
while(stopEvnt.TryWait()){
|
||||
nn::os::Thread::Yield();
|
||||
|
||||
};
|
||||
gui.Finalize();
|
||||
}
|
||||
|
||||
//YES-NO ボタン
|
||||
void YesNo()
|
||||
{
|
||||
gui.ButtonMask(nn::hid::BUTTON_A | nn::hid::BUTTON_B);
|
||||
gui.PanelEffective(PANEL_YES);
|
||||
gui.PanelEffective(PANEL_NO);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
void Quit()
|
||||
{
|
||||
gui.ButtonMask(nn::hid::BUTTON_A | nn::hid::BUTTON_B);
|
||||
gui.PanelEffective(PANEL_QUIT);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
|
||||
//トップメニュー画面
|
||||
//引数:カード状態
|
||||
void scr_TopMenuDbg(bool formatted,bool insertted)//デバッグ用
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.ButtonMask(nn::hid::BUTTON_A | nn::hid::BUTTON_R | nn::hid::BUTTON_L);
|
||||
|
||||
if (formatted)
|
||||
{//リード可能
|
||||
gui.MessSet(&mess_topmenu_help_read);
|
||||
gui.PanelEffective(PANEL_READ);
|
||||
}else{//リード不可
|
||||
gui.MessSet(&mess_topmenu_help_notread);
|
||||
gui.PanelEffective(PANEL_READ,false);
|
||||
}
|
||||
if (insertted)
|
||||
{//書き込み可
|
||||
gui.MessSet(&mess_topmenu_help_write);
|
||||
gui.PanelEffective(PANEL_WRITE);
|
||||
}else{//書き込み不可
|
||||
gui.MessSet(&mess_topmenu_help_notwrite);
|
||||
gui.PanelEffective(PANEL_WRITE,false);
|
||||
}
|
||||
|
||||
gui.MessEffective(MESSAGE_TOPMENU_HELP_READ);
|
||||
gui.MessEffective(MESSAGE_TOPMENU_HELP_WRITE);
|
||||
// gui.PanelEffective(PANEL_END);
|
||||
gui.PanelEffective(PANEL_TOPMENU);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
//通常時
|
||||
|
||||
//プロダクトコード
|
||||
//引数:カード、拡張セーブに記録されたもの
|
||||
char scr_pcode[32];
|
||||
void scr_PrdCode(char *s)
|
||||
{
|
||||
strcpy(scr_pcode,"CARD : ");
|
||||
if (s[0]==0) strcat(scr_pcode,"----");
|
||||
else strcat(scr_pcode,s);
|
||||
gui.MessStr(MESSAGE_PRODUCT,scr_pcode);
|
||||
}
|
||||
|
||||
char scr_pcode2[64];
|
||||
void scr_PrdCodeEx(char *s)
|
||||
{
|
||||
strcpy(scr_pcode2,"BKUP : ");
|
||||
if (s[0]==0) strcat(scr_pcode2,"----");
|
||||
else strcat(scr_pcode2,s);
|
||||
gui.MessStr(MESSAGE_PRODUCT2,scr_pcode2);
|
||||
}
|
||||
|
||||
//削除の実行確認
|
||||
void scr_DelConf()
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.PanelEffective(PANEL_DELCONF);
|
||||
YesNo();
|
||||
}
|
||||
|
||||
|
||||
//Top menu
|
||||
//引数:デバイス状態
|
||||
//arg : プロダクトコード一致
|
||||
void scr_TopMenu(bool formatted,bool inserted,bool exfm,bool bkupins,int err)
|
||||
{
|
||||
|
||||
int i;
|
||||
scr_evnt = EVNT_NONE;
|
||||
|
||||
u32 mask = 0;
|
||||
mask |= (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X);//LEFT+X = Delete 有効
|
||||
#ifdef DEBUG_ENABLE
|
||||
mask | = ( nn::hid::BUTTON_DOWN | nn::hid::BUTTON_Y |nn::hid::BUTTON_X|nn::hid::BUTTON_L | nn::hid::BUTTON_R);
|
||||
#endif
|
||||
#ifdef CRUSH_ENABLE
|
||||
extern bool CrashForDebug;
|
||||
mask | = nn::hid::BUTTON_Y;
|
||||
if (CrashForDebug==0) gui.MessEffective(MESSAGE_MENU_DEBUG,false,false);
|
||||
else{
|
||||
sprintf(scr_debug,"Crush mode %d",CrashForDebug);
|
||||
gui.MessEffective(MESSAGE_MENU_DEBUG);
|
||||
}
|
||||
#endif
|
||||
|
||||
gui.MessStr(MESSAGE_TITLE," < CTR Card Savedata Mover >");
|
||||
|
||||
gui.MessEffective(MESSAGE_MENU_ERROR,false,false);
|
||||
gui.MessEffective(MESSAGE_MENU_CAUTION,false,false);
|
||||
gui.MessEffective(MESSAGE_MENU_OPERATE,false,false);
|
||||
//片方のみ有効
|
||||
if (formatted && bkupins && (exfm == false))
|
||||
{//バックアップ
|
||||
gui.MessEffective(MESSAGE_MENU_OPERATE);
|
||||
gui.PanelEffective(PANEL_READ);
|
||||
gui.PanelEffective(PANEL_WRITE,false,false);
|
||||
}else if (exfm && inserted)
|
||||
{//リストア
|
||||
mask |= (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X);//LEFT+X = Delete 有効
|
||||
gui.PanelEffective(PANEL_READ,false,false);
|
||||
i =0;
|
||||
if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//バックアップがない
|
||||
else
|
||||
if (err & SDATA_ERRPUT_PCODE) i = ERC_DEV_OTHER + ERC_PRODCODE;//プロダクトコード不一致
|
||||
if (i !=0 )
|
||||
{
|
||||
gui.PanelEffective(PANEL_WRITE,false,false);
|
||||
sprintf(scr_err,"ERROR %d",i);
|
||||
gui.MessEffective(MESSAGE_MENU_ERROR);
|
||||
}
|
||||
else{
|
||||
gui.MessEffective(MESSAGE_MENU_OPERATE);
|
||||
gui.PanelEffective(PANEL_WRITE);
|
||||
}
|
||||
}else{//なし
|
||||
gui.PanelEffective(PANEL_WRITE,false,false);
|
||||
gui.PanelEffective(PANEL_READ,false,false);
|
||||
|
||||
if (inserted == false)
|
||||
{
|
||||
strcpy(scr_err,"Please Insert Card");
|
||||
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 (bkupins == 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);
|
||||
}
|
||||
}
|
||||
|
||||
gui.ButtonMask(mask);
|
||||
|
||||
gui.MessEffective(MESSAGE_PRODUCT);
|
||||
gui.MessEffective(MESSAGE_PRODUCT2);
|
||||
|
||||
gui.PanelEffective(PANEL_TITLE);
|
||||
gui.PanelEffective(PANEL_MENU);
|
||||
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
//デバッグ用、ボタン待ち
|
||||
void ScrStep()
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.ButtonMask(nn::hid::BUTTON_B);
|
||||
}
|
||||
|
||||
|
||||
void ClearBkupMess()
|
||||
{
|
||||
gui.MessEffective(MESSAGE_CONF,false,false);
|
||||
gui.MessEffective(MESSAGE_RESULT,false,false);
|
||||
gui.MessEffective(MESSAGE_OPERATE,false,false);
|
||||
gui.MessEffective(MESSAGE_QUIT_OPERATE,false,false);
|
||||
gui.MessEffective(MESSAGE_STATUS,false,false);
|
||||
gui.MessEffective(MESSAGE_COUNT,false,false);
|
||||
gui.MessEffective(MESSAGE_COUNT2,false,false);
|
||||
gui.PanelEffective(PANEL_BKUP);
|
||||
}
|
||||
|
||||
//Backup
|
||||
void scr_Backup()
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.PanelLineStyle(PANEL_BKUP,COLOR_SKY);
|
||||
gui.MessStr(MESSAGE_TITLE," --- Backup Card Savedata ---");
|
||||
gui.PanelEffective(PANEL_TITLE);
|
||||
ClearBkupMess();
|
||||
gui.Draw();
|
||||
|
||||
}
|
||||
void scr_BackupYesNo()
|
||||
{
|
||||
scr_Backup();
|
||||
gui.MessEffective(MESSAGE_CONF);
|
||||
gui.MessEffective(MESSAGE_OPERATE);
|
||||
YesNo();
|
||||
}
|
||||
|
||||
//restore
|
||||
void scr_Restore()
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.PanelLineStyle(PANEL_BKUP,COLOR_PARPL);
|
||||
gui.MessStr(MESSAGE_TITLE,"--- Restore Card Savedata ---");
|
||||
gui.PanelEffective(PANEL_TITLE);
|
||||
ClearBkupMess();//backupと同じパネルを使う
|
||||
gui.Draw();
|
||||
|
||||
}
|
||||
void scr_RestoreYesNo()
|
||||
{
|
||||
scr_Restore();
|
||||
gui.MessEffective(MESSAGE_CONF);
|
||||
gui.MessEffective(MESSAGE_OPERATE);
|
||||
YesNo();
|
||||
}
|
||||
|
||||
|
||||
void scr_Status(char *s,eColor col)
|
||||
{
|
||||
gui.MessCol(MESSAGE_STATUS,col);
|
||||
gui.MessStr(MESSAGE_STATUS,s);
|
||||
gui.MessEffective(MESSAGE_STATUS);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
void scr_ResultQuit(char *s,eColor col)
|
||||
{
|
||||
gui.MessCol(MESSAGE_RESULT,col);
|
||||
gui.MessStr(MESSAGE_RESULT,s);
|
||||
gui.MessEffective(MESSAGE_RESULT);
|
||||
gui.MessEffective(MESSAGE_QUIT_OPERATE);
|
||||
Quit();
|
||||
}
|
||||
|
||||
|
||||
void scr_InsExitQuit()
|
||||
{
|
||||
ClearBkupMess();
|
||||
gui.PanelLineStyle(PANEL_INSEXIT,COLOR_RED);
|
||||
gui.PanelEffective(PANEL_INSEXIT);
|
||||
Quit();
|
||||
}
|
||||
|
||||
// カウント/MAX 表示
|
||||
char str_Counter[128];
|
||||
char str_Counter2[128];
|
||||
void scr_CountPerMax(int ct,int max)
|
||||
{
|
||||
sprintf(str_Counter,"%d / %d",ct,max);
|
||||
gui.MessStr(MESSAGE_COUNT,str_Counter);
|
||||
gui.MessEffective(MESSAGE_COUNT);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
//ゲージ&total
|
||||
void scr_CountPerMax2(int ct,int max,int total)
|
||||
{
|
||||
if (total == -1) str_Counter2[0]=0;
|
||||
else if (total != 0){
|
||||
// gui.MessCol(MESSAGE_COUNT2,COLOR_WHITE);
|
||||
sprintf(str_Counter2,"total size %d",total);
|
||||
}else{
|
||||
// gui.MessCol(MESSAGE_COUNT2,COLOR_YELLO);
|
||||
int i;
|
||||
int lv = ct/(max/25);
|
||||
for (i =0;i<lv;i++)str_Counter2[i] = '>';
|
||||
while ( i < 25 )str_Counter2[i++] = '|';
|
||||
str_Counter2[i] = 0;
|
||||
}
|
||||
//sprintf(str_Counter2,"%d / %d",ct,max);
|
||||
gui.MessStr(MESSAGE_COUNT2,str_Counter2);
|
||||
gui.MessEffective(MESSAGE_COUNT2);
|
||||
gui.Draw();
|
||||
|
||||
}
|
||||
|
||||
void scr_MessOnCount2(char *str)
|
||||
{
|
||||
// gui.MessCol(MESSAGE_COUNT2,COLOR_YELLO);
|
||||
gui.MessStr(MESSAGE_COUNT2,str);
|
||||
gui.MessEffective(MESSAGE_COUNT2);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
|
||||
//実行確認
|
||||
void scr_ConfirmDbg(char *str)
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.MessStr(MESSAGE_CONFIRM_TITLE,str);
|
||||
gui.PanelEffective(PANEL_CONFIRM);
|
||||
YesNo();
|
||||
}
|
||||
|
||||
|
||||
//エラー表示とQuitボタン
|
||||
void scr_ErrorQuitDbg(tColStr **s)
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.MessStr(MESSAGE_ERROR_TITLE,s[0]->str);
|
||||
gui.MessCol(MESSAGE_ERROR_TITLE,s[0]->color);
|
||||
gui.MessStr(MESSAGE_ERROR_INFO,s[1]->str);
|
||||
gui.MessCol(MESSAGE_ERROR_INFO,s[1]->color);
|
||||
gui.MessStr(MESSAGE_ERROR_INFO2,s[2]->str);
|
||||
gui.MessCol(MESSAGE_ERROR_INFO2,s[2]->color);
|
||||
gui.MessStr(MESSAGE_ERROR_INFO3,s[3]->str);
|
||||
gui.MessCol(MESSAGE_ERROR_INFO3,s[3]->color);
|
||||
gui.PanelEffective(PANEL_ERROR);
|
||||
Quit();
|
||||
}
|
||||
|
||||
//成功表示とQuitボタン
|
||||
void scr_SuccessQuitDbg(tColStr **s)
|
||||
{
|
||||
scr_evnt = EVNT_NONE;
|
||||
gui.MessStr(MESSAGE_SUCCESS_TITLE,s[0]->str);
|
||||
gui.MessCol(MESSAGE_SUCCESS_TITLE,s[0]->color);
|
||||
gui.MessStr(MESSAGE_SUCCESS_INFO,s[1]->str);
|
||||
gui.MessCol(MESSAGE_SUCCESS_INFO,s[1]->color);
|
||||
gui.MessStr(MESSAGE_SUCCESS_INFO2,s[2]->str);
|
||||
gui.MessCol(MESSAGE_SUCCESS_INFO2,s[2]->color);
|
||||
gui.PanelEffective(PANEL_SUCCESS);
|
||||
Quit();
|
||||
}
|
||||
|
||||
|
||||
//デバッグログ
|
||||
void scr_DgbLog(cStrLst *p)
|
||||
{
|
||||
gui.PanelLineStyle(PANEL_DBGLOG,COLOR_BLUE);
|
||||
|
||||
for (int i=0;i<p->getpos()+1;i++)gui.MemoStr(MEMO_DBGLOG,p->line(i),i);
|
||||
|
||||
gui.PanelEffective(PANEL_DBGLOG);
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ScrDbgLogGetMax()
|
||||
{
|
||||
return LOG_MAX;
|
||||
}
|
||||
|
||||
|
||||
void scr_Draw()
|
||||
{
|
||||
gui.Draw();
|
||||
}
|
||||
|
||||
void scr_GetEvnt()
|
||||
{
|
||||
// gui.thUpdate();
|
||||
}
|
||||
|
||||
|
||||
@ -1,115 +0,0 @@
|
||||
#ifndef SCREEN_H_
|
||||
#define SCREEN_H_
|
||||
|
||||
#include <string.h>
|
||||
#include <nn/types.h>
|
||||
#include "../gui/gui.h"
|
||||
|
||||
//パネルのID
|
||||
enum {
|
||||
EVNT_NONE,
|
||||
EVNT_YES,
|
||||
EVNT_NO,
|
||||
EVNT_QUIT,
|
||||
EVNT_PUSH_A,
|
||||
EVNT_PUSH_B,
|
||||
EVNT_PUSH_R,
|
||||
EVNT_PUSH_L,
|
||||
EVNT_PUSH_X,
|
||||
EVNT_PUSH_Y,
|
||||
EVNT_PUSH_LEFT_X,
|
||||
EVNT_PUSH_DOWN_Y,
|
||||
EVNT_SEL_READ,
|
||||
EVNT_SEL_WRITE,
|
||||
EVNT_SEL_END,
|
||||
EVNT_ERROR,
|
||||
EVNT_FATAL
|
||||
};
|
||||
|
||||
typedef struct{
|
||||
char *str;
|
||||
eColor color;
|
||||
u8 pad[3];
|
||||
}tColStr;
|
||||
|
||||
|
||||
#define LST_MAX 30
|
||||
#define LST_LENGTH 128
|
||||
class cStrLst {
|
||||
private:
|
||||
int pos;
|
||||
int buttom;
|
||||
char str[LST_MAX][LST_LENGTH];
|
||||
public:
|
||||
cStrLst():pos(0){};
|
||||
void add(char *p){
|
||||
if (pos>=LST_MAX)return;
|
||||
//char *s = &str[pos][0];
|
||||
int i;
|
||||
if (pos == buttom)
|
||||
{
|
||||
i =0;
|
||||
while(i < buttom){ strcpy(str[i],str[i+1]);i++;}
|
||||
}else pos++;
|
||||
i=0;
|
||||
while(i < (LST_LENGTH-1)){ //オーバーロード対策
|
||||
if (p[i]!=0){
|
||||
str[pos][i] = p[i];
|
||||
i++;
|
||||
}else break;
|
||||
}
|
||||
str[pos][i] = 0;
|
||||
//strcpy(str[pos],p);
|
||||
//for (i =0;i<LST_LENGTH;i++){
|
||||
// s[i]=p[i];
|
||||
// if (p[i] ==0) return;
|
||||
//}
|
||||
};
|
||||
void clr(){pos = 0;for (int i =0;i<LST_MAX;i++)str[i][0]=0;};
|
||||
u16 getpos(){return pos;};
|
||||
char* line(u16 ln){return &str[ln][0];};
|
||||
bool setbuttom(int btm)
|
||||
{
|
||||
if ((btm<0)||(btm>=LST_MAX))return false;
|
||||
buttom = btm;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//Topメニューでのエラー表示用のフラグ
|
||||
//bitチェック
|
||||
#define SDATA_ERRPUT_PCODE 1
|
||||
#define SDATA_ERRPUT_MEDIA 2
|
||||
#define SDATA_ERRPUT_VERIFI 4
|
||||
|
||||
|
||||
bool ScrInitialize(uptr heap,u32 size);
|
||||
void ScrFinalize();
|
||||
void ScrClr();
|
||||
int ScrDbgLogGetMax();
|
||||
void ScrStep();
|
||||
void scr_TopMenuDbg(bool formatted,bool insertted);
|
||||
void scr_TopMenu(bool formatted,bool inserted,bool exfm,bool sdins,int err);
|
||||
void scr_ErrorQuitDbg(tColStr **s);
|
||||
void scr_SuccessQuitDbg(tColStr **s);
|
||||
void scr_ConfirmDbg(char *str);
|
||||
void scr_DgbLog(cStrLst *p);
|
||||
void scr_BackupYesNo();
|
||||
void scr_Backup();
|
||||
void scr_RestoreYesNo();
|
||||
void scr_Restore();
|
||||
void scr_InsExitQuit();
|
||||
void scr_Status(char *s,eColor col);
|
||||
void scr_ResultQuit(char *s,eColor col);
|
||||
void scr_CountPerMax(int ct,int max);
|
||||
void scr_CountPerMax2(int ct,int max,int total);
|
||||
void scr_PrdCode(char *s);
|
||||
void scr_PrdCodeEx(char *s);
|
||||
void scr_DelConf();
|
||||
void scr_MessOnCount2(char *str);
|
||||
void scr_Draw();
|
||||
void scr_GetEvnt();
|
||||
|
||||
#endif
|
||||
|
||||
@ -1,191 +0,0 @@
|
||||
#include <nn.h>
|
||||
#include <nn/applet.h>
|
||||
#include "common.h"
|
||||
#include "sleep.h"
|
||||
#include "demo.h"
|
||||
|
||||
|
||||
extern demo::RenderSystemDrawing s_RenderSystem;
|
||||
extern nn::fnd::ExpHeap appHeap;
|
||||
extern uptr heapForGx;
|
||||
|
||||
bool prohibitHome = false;// HOME ボタン禁止
|
||||
|
||||
// ファイルシステム処理と遷移やスリープ処理との排他制御に利用
|
||||
//nn::os::CriticalSection g_SleepCS;
|
||||
// HOME ボタン遷移とファイルシステム処理の排他制御に利用(手動リセット)
|
||||
nn::os::LightEvent g_TransitionEvent;
|
||||
// スリープとファイルシステム処理の排他制御に利用(手動リセット)
|
||||
nn::os::LightEvent g_AwakeEvent;
|
||||
|
||||
void restoreGraphicSetting()
|
||||
{
|
||||
// GPU レジスタ設定の復帰
|
||||
// ただし、下記は DMPGL API を使用して設定した状態の復帰のみ
|
||||
// レジスタ設定コマンドは全て再発行するべき
|
||||
nngxUpdateState(NN_GX_STATE_ALL);
|
||||
nngxValidateState(NN_GX_STATE_ALL,GL_TRUE);
|
||||
}
|
||||
|
||||
FUNCP end_func;
|
||||
void InitSysBreak(uptr adrs){
|
||||
end_func = (FUNCP)adrs;
|
||||
|
||||
SleepHandler::Initialize();
|
||||
|
||||
//g_SleepCS.Initialize();
|
||||
g_AwakeEvent.Initialize(true);
|
||||
g_TransitionEvent.Initialize(true);
|
||||
|
||||
// 起床中は常に Signal 状態にしておく
|
||||
g_AwakeEvent.Signal();
|
||||
g_TransitionEvent.Signal();
|
||||
|
||||
// アプレットライブラリに関する機能を有効にする
|
||||
nn::applet::Enable(false);
|
||||
// gx, snd, dsp 各ライブラリの Initialize 関数は applet::Enable() の後に呼ばれなければならない
|
||||
// 特に、gx の初期化である nngxInitialize 関数は、Enable() 直後の終了判定の後に行われるべき
|
||||
|
||||
// ロゴ表示時に電源ボタンが押されたなど、既に終了条件が立っていた場合、ここでアプリを終了させる
|
||||
if ( nn::applet::IsExpectedToCloseApplication() )
|
||||
{
|
||||
SleepHandler::Finalize();
|
||||
nn::Result result = nn::applet::PrepareToCloseApplication();
|
||||
NN_UTIL_PANIC_IF_FAILED( result );
|
||||
nn::applet::CloseApplication();
|
||||
}
|
||||
// グラフィックスライブラリの初期化は、以降で行わなければならない
|
||||
// 他、アプリケーションの初期化処理
|
||||
|
||||
}
|
||||
|
||||
|
||||
//終了処理
|
||||
void finish()
|
||||
{
|
||||
|
||||
SleepHandler::Finalize();//SLEEP
|
||||
//g_SleepCS.Finalize();
|
||||
|
||||
(*end_func)();
|
||||
|
||||
g_AwakeEvent.Finalize();
|
||||
g_TransitionEvent.Finalize();
|
||||
|
||||
nn::fs::Finalize();
|
||||
|
||||
|
||||
appHeap.Free(reinterpret_cast<void*>(heapForGx));
|
||||
appHeap.Finalize();
|
||||
|
||||
nn::os::SetDeviceMemorySize(0);
|
||||
nn::os::SetHeapSize(0);
|
||||
|
||||
NN_LOG("End\n");
|
||||
nn::applet::PrepareToCloseApplication();
|
||||
nn::applet::CloseApplication();
|
||||
}
|
||||
|
||||
|
||||
void CheckSysBreak(){
|
||||
// スリープからの起床時は、1フレーム分の描画完了を待ってから LCD を有効にする
|
||||
if ( SleepHandler::s_IsAfterWakeUp ) {
|
||||
nn::gx::StartLcdDisplay();
|
||||
SleepHandler::s_IsAfterWakeUp = false;
|
||||
}
|
||||
|
||||
// GPU のレジスタ設定の整合性を考慮した場合、
|
||||
// 各種遷移、スリープ要求への返答は描画終了後に行うべき
|
||||
|
||||
// 本体スリープ判定
|
||||
if ( SleepHandler::IsSleepRequested() )
|
||||
{
|
||||
SleepHandler::SleepSystem();
|
||||
}
|
||||
|
||||
// 終了要求をチェック
|
||||
if ( nn::applet::IsExpectedToCloseApplication() )
|
||||
{
|
||||
finish();
|
||||
}
|
||||
|
||||
// アプリケーションの遷移処理を行う
|
||||
|
||||
// HOMEボタン処理(グラフィックスライブラリが初期化済みでなければならない)
|
||||
if ( nn::applet::IsExpectedToProcessHomeButton() )
|
||||
{
|
||||
if (prohibitHome){ // HOME ボタン禁止
|
||||
nn::applet::ClearHomeButtonState();//HOME ボタンフラグ削除
|
||||
}else
|
||||
{
|
||||
g_TransitionEvent.ClearSignal();
|
||||
|
||||
// ファイルシステム処理中は遷移を待つ
|
||||
//if ( g_SleepCS.TryEnter() )
|
||||
{
|
||||
// スリープ要求を REJECT するように
|
||||
nn::applet::DisableSleep();
|
||||
|
||||
//nngxWaitCmdlistDone();
|
||||
nn::applet::ProcessHomeButton();
|
||||
nn::applet::AppletWakeupState wState = nn::applet::WaitForStarting();
|
||||
NN_UNUSED_VAR(wState);
|
||||
|
||||
//g_SleepCS.Leave();
|
||||
g_TransitionEvent.Signal();
|
||||
|
||||
// HOME メニューからの中断やバッテリー不足の要因により
|
||||
// アプリ終了と判断された場合、アプリのメインループを抜けて終了処理へ
|
||||
if ( nn::applet::IsExpectedToCloseApplication() )
|
||||
{
|
||||
// 描画権は渡されていない
|
||||
finish();
|
||||
}
|
||||
|
||||
nn::applet::EnableSleep(true);
|
||||
|
||||
// グラフィックの設定を戻す
|
||||
restoreGraphicSetting();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 電源ボタン処理(グラフィックスライブラリが初期化済みでなければならない)
|
||||
if ( nn::applet::IsExpectedToProcessPowerButton() )
|
||||
{
|
||||
g_TransitionEvent.ClearSignal();
|
||||
|
||||
// ファイルシステム処理中は遷移を待つ
|
||||
//if ( g_SleepCS.TryEnter() )
|
||||
{
|
||||
nn::applet::DisableSleep();
|
||||
//nngxWaitCmdlistDone();
|
||||
nn::applet::ProcessPowerButton();
|
||||
nn::applet::AppletWakeupState wState = nn::applet::WaitForStarting();
|
||||
|
||||
NN_UNUSED_VAR(wState);
|
||||
|
||||
//g_SleepCS.Leave();
|
||||
g_TransitionEvent.Signal();
|
||||
|
||||
// アプリ終了と判断された場合、アプリのメインループを抜けて終了処理へ
|
||||
if ( nn::applet::IsExpectedToCloseApplication() )
|
||||
{
|
||||
// 描画権は渡されていない
|
||||
finish();
|
||||
}
|
||||
|
||||
nn::applet::EnableSleep(true);
|
||||
|
||||
// グラフィックの設定を戻す
|
||||
restoreGraphicSetting();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
#ifndef COMMON_H_
|
||||
#define COMMON_H_
|
||||
|
||||
typedef void (*FUNCP)();
|
||||
|
||||
void finish();
|
||||
void CheckSysBreak();
|
||||
void InitSysBreak(uptr adrs);
|
||||
|
||||
|
||||
#endif
|
||||
@ -1,368 +0,0 @@
|
||||
|
||||
#include <nn.h>
|
||||
#include <nn/fs.h>
|
||||
#include <nn/font.h>
|
||||
#include <nn/math.h>
|
||||
#include <nn/pl.h>
|
||||
#include <nn/util.h>
|
||||
|
||||
#include "demo.h"
|
||||
|
||||
const char s_ShaderBinaryFilePath[] = "rom:/nnfont_RectDrawerShader.shbin";
|
||||
|
||||
extern nn::fnd::ExpHeap appHeap;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief シェーダの初期化を行います。
|
||||
//!
|
||||
//! @param[in,out] pResource 描画用リソースを管理するオブジェクトへのポインタ。
|
||||
//---------------------------------------------------------------------------
|
||||
void*
|
||||
InitShaders(nn::font::RectDrawer* pDrawer)
|
||||
{
|
||||
const size_t ROMFS_BUFFER_SIZE = 1024 * 64;
|
||||
static char buffer[ROMFS_BUFFER_SIZE];
|
||||
|
||||
nn::fs::MountRom(16, 16, buffer, ROMFS_BUFFER_SIZE);
|
||||
nn::fs::FileReader shaderReader(s_ShaderBinaryFilePath);
|
||||
|
||||
const u32 fileSize = (u32)shaderReader.GetSize();
|
||||
|
||||
void* shaderBinary = appHeap.Allocate(fileSize);
|
||||
NN_NULL_ASSERT(shaderBinary);
|
||||
|
||||
shaderReader.Read(shaderBinary, fileSize);
|
||||
|
||||
const u32 vtxBufCmdBufSize =
|
||||
nn::font::RectDrawer::GetVertexBufferCommandBufferSize(shaderBinary, fileSize);
|
||||
void *const vtxBufCmdBuf = appHeap.Allocate(vtxBufCmdBufSize);
|
||||
NN_NULL_ASSERT(vtxBufCmdBuf);
|
||||
pDrawer->Initialize(vtxBufCmdBuf, shaderBinary, fileSize);
|
||||
|
||||
appHeap.Free(shaderBinary);
|
||||
|
||||
shaderReader.Finalize();
|
||||
nn::fs::Unmount("rom:");
|
||||
return vtxBufCmdBuf;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*
|
||||
@brief グラフィックスの初期設定を行います。
|
||||
*---------------------------------------------------------------------------*/
|
||||
void
|
||||
InitGX()
|
||||
{
|
||||
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief 描画の初期設定を行います。
|
||||
//!
|
||||
//! @param[in] width 画面の幅。
|
||||
//! @param[in] height 画面の高さ。
|
||||
//---------------------------------------------------------------------------
|
||||
void
|
||||
InitDraw(
|
||||
int width,
|
||||
int height
|
||||
)
|
||||
{
|
||||
// カラーバッファ情報
|
||||
// LCDの向きに合わせて、幅と高さを入れ替えています。
|
||||
const nn::font::ColorBufferInfo colBufInfo = { width, height, PICA_DATA_DEPTH24_STENCIL8_EXT };
|
||||
|
||||
const u32 screenSettingCommands[] =
|
||||
{
|
||||
|
||||
// ビューポートの設定
|
||||
NN_FONT_CMD_SET_VIEWPORT( 0, 0, colBufInfo.width, colBufInfo.height ),
|
||||
|
||||
// シザー処理を無効
|
||||
NN_FONT_CMD_SET_DISABLE_SCISSOR( colBufInfo ),
|
||||
|
||||
// wバッファの無効化
|
||||
// デプスレンジの設定
|
||||
// ポリゴンオフセットの無効化
|
||||
NN_FONT_CMD_SET_WBUFFER_DEPTHRANGE_POLYGONOFFSET(
|
||||
0.0f, // wScale : 0.0 でWバッファが無効
|
||||
0.0f, // depth range near
|
||||
1.0f, // depth range far
|
||||
0, // polygon offset units : 0.0 で ポリゴンオフセットが無効
|
||||
colBufInfo),
|
||||
};
|
||||
|
||||
nngxAdd3DCommand(screenSettingCommands, sizeof(screenSettingCommands), true);
|
||||
|
||||
static const u32 s_InitCommands[] =
|
||||
{
|
||||
// カリングを無効
|
||||
NN_FONT_CMD_SET_CULL_FACE( NN_FONT_CMD_CULL_FACE_DISABLE ),
|
||||
|
||||
// ステンシルテストを無効
|
||||
NN_FONT_CMD_SET_DISABLE_STENCIL_TEST(),
|
||||
|
||||
// デプステストを無効
|
||||
// カラーバッファの全ての成分を書き込み可
|
||||
NN_FONT_CMD_SET_DEPTH_FUNC_COLOR_MASK(
|
||||
false, // isDepthTestEnabled
|
||||
0, // depthFunc
|
||||
true, // depthMask
|
||||
true, // red
|
||||
true, // green
|
||||
true, // blue
|
||||
true), // alpha
|
||||
|
||||
// アーリーデプステストを無効
|
||||
NN_FONT_CMD_SET_ENABLE_EARLY_DEPTH_TEST( false ),
|
||||
|
||||
// フレームバッファアクセス制御
|
||||
NN_FONT_CMD_SET_FBACCESS(
|
||||
true, // colorRead
|
||||
true, // colorWrite
|
||||
false, // depthRead
|
||||
false, // depthWrite
|
||||
false, // stencilRead
|
||||
false), // stencilWrite
|
||||
};
|
||||
|
||||
nngxAdd3DCommand(s_InitCommands, sizeof(s_InitCommands), true);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief ResFontを構築します。
|
||||
//!
|
||||
//! @param[out] pFont 構築するフォントへのポインタ。
|
||||
//! @param[in] filePath ロードするフォントリソースファイル名。
|
||||
//!
|
||||
//! @return ResFont構築の成否を返します。
|
||||
//---------------------------------------------------------------------------
|
||||
bool
|
||||
InitFont(
|
||||
nn::font::ResFont* pFont,
|
||||
void* pBuffer
|
||||
)
|
||||
{
|
||||
// フォントリソースをセットします
|
||||
bool bSuccess = pFont->SetResource(pBuffer);
|
||||
|
||||
// 描画用バッファを設定します。
|
||||
const u32 drawBufferSize = nn::font::ResFont::GetDrawBufferSize(pBuffer);
|
||||
void* drawBuffer = appHeap.Allocate(drawBufferSize, 4);
|
||||
pFont->SetDrawBuffer(drawBuffer);
|
||||
NN_NULL_ASSERT(drawBuffer);
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief ResFontを破棄します。
|
||||
//!
|
||||
//! @param[in] pFont 破棄するフォントへのポインタ。
|
||||
//---------------------------------------------------------------------------
|
||||
void
|
||||
CleanupFont(nn::font::ResFont* pFont)
|
||||
{
|
||||
// 描画用バッファの無効化
|
||||
// 描画用バッファがセットされているなら 構築時に SetDrawBuffer に渡したバッファへの
|
||||
// ポインタが返ってきます。
|
||||
void *const drawBuffer = pFont->SetDrawBuffer(NULL);
|
||||
if (drawBuffer != NULL)
|
||||
{
|
||||
appHeap.Free(drawBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief 表示文字列用バッファを確保します。
|
||||
//!
|
||||
//! @param[in] charMax 表示する文字列の最大文字数。
|
||||
//!
|
||||
//! @return 確保した表示文字列用バッファへのポインタを返します。
|
||||
//---------------------------------------------------------------------------
|
||||
nn::font::DispStringBuffer*
|
||||
AllocDispStringBuffer(int charMax)
|
||||
{
|
||||
const u32 DrawBufferSize = nn::font::CharWriter::GetDispStringBufferSize(charMax);
|
||||
void *const bufMem = appHeap.Allocate(DrawBufferSize);
|
||||
NN_NULL_ASSERT(bufMem);
|
||||
|
||||
return nn::font::CharWriter::InitDispStringBuffer(bufMem, charMax);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief 文字列表示用にモデルビュー行列と射影行列を設定します。
|
||||
//!
|
||||
//! @param[in] pDrawer RectDrawerオブジェクトへのポインタ。
|
||||
//! @param[in] width 画面の幅。
|
||||
//! @param[in] height 画面の高さ。
|
||||
//---------------------------------------------------------------------------
|
||||
void
|
||||
SetupTextCamera(
|
||||
nn::font::RectDrawer* pDrawer,
|
||||
int width,
|
||||
int height
|
||||
)
|
||||
{
|
||||
// 射影行列を正射影に設定
|
||||
{
|
||||
// 左上原点とし、Y軸とZ軸の向きが逆になるように設定します。
|
||||
nn::math::MTX44 proj;
|
||||
f32 znear = 0.0f;
|
||||
f32 zfar = -1.0f;
|
||||
f32 t = 0;
|
||||
f32 b = static_cast<f32>(width);
|
||||
f32 l = 0;
|
||||
f32 r = static_cast<f32>(height);
|
||||
nn::math::MTX44OrthoPivot(&proj, l, r, b, t, znear, zfar, nn::math::PIVOT_UPSIDE_TO_TOP);
|
||||
pDrawer->SetProjectionMtx(proj);
|
||||
}
|
||||
|
||||
// モデルビュー行列を単位行列に設定
|
||||
{
|
||||
nn::math::MTX34 mv;
|
||||
nn::math::MTX34Identity(&mv);
|
||||
pDrawer->SetViewMtxForText(mv);
|
||||
}
|
||||
}
|
||||
|
||||
nn::font::RectDrawer drawer;
|
||||
void *drawerBuf;
|
||||
nn::font::DispStringBuffer *pDrawStringBuf0;
|
||||
nn::font::DispStringBuffer *pDrawStringBuf1;
|
||||
nn::font::ResFont font;
|
||||
nn::font::TextWriter writer;
|
||||
//---------------------------------------------------------------------------
|
||||
//! @brief ASCII文字列を描画します。
|
||||
//---------------------------------------------------------------------------
|
||||
void shf_DrawText_0( u16 x,u16 y,char *s)
|
||||
{
|
||||
writer.SetCursor(x, y);
|
||||
|
||||
writer.StartPrint();
|
||||
(void)writer.Print(s);
|
||||
writer.EndPrint();
|
||||
drawer.BuildTextCommand(&writer);
|
||||
|
||||
|
||||
drawer.DrawBegin();
|
||||
|
||||
SetupTextCamera(&drawer, NN_GX_DISPLAY0_WIDTH, NN_GX_DISPLAY0_HEIGHT);
|
||||
writer.UseCommandBuffer();
|
||||
|
||||
drawer.DrawEnd();
|
||||
}
|
||||
|
||||
void shf_DrawText_1( u16 x,u16 y,char *s)
|
||||
{
|
||||
writer.SetCursor(x, y);
|
||||
|
||||
writer.StartPrint();
|
||||
(void)writer.Print(s);
|
||||
writer.EndPrint();
|
||||
drawer.BuildTextCommand(&writer);
|
||||
|
||||
|
||||
drawer.DrawBegin();
|
||||
|
||||
SetupTextCamera(&drawer, NN_GX_DISPLAY1_WIDTH, NN_GX_DISPLAY1_HEIGHT);
|
||||
writer.UseCommandBuffer();
|
||||
|
||||
drawer.DrawEnd();
|
||||
}
|
||||
|
||||
|
||||
void shf_SetSize(f32 sz)
|
||||
{
|
||||
writer.SetScale(sz/14,sz/20);
|
||||
}
|
||||
|
||||
void shf_SetScale(f32 h,f32 v)
|
||||
{
|
||||
writer.SetScale(h,v);
|
||||
}
|
||||
|
||||
|
||||
void shf_SetFontSize(f32 sz)
|
||||
{
|
||||
writer.SetFontSize(sz);
|
||||
}
|
||||
|
||||
f32 shf_GetFontWidth()
|
||||
{
|
||||
return writer.GetFontWidth();
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
//初期化
|
||||
//AppHeap確保、RenderSystem.Inititの後に呼ぶ
|
||||
void SharedFontInit()
|
||||
{
|
||||
|
||||
InitGX();
|
||||
|
||||
// 共有フォントの初期化
|
||||
NN_UTIL_PANIC_IF_FAILED(nn::pl::InitializeSharedFont());
|
||||
|
||||
// 共有フォントのロードが完了するまで待機
|
||||
while (nn::pl::GetSharedFontLoadState() != nn::pl::SHARED_FONT_LOAD_STATE_LOADED)
|
||||
{
|
||||
// 共有フォントのロードに失敗していないか確認
|
||||
if (nn::pl::GetSharedFontLoadState() == nn::pl::SHARED_FONT_LOAD_STATE_FAILED)
|
||||
{
|
||||
NN_TPANIC_("failed to load shared font!\n");
|
||||
}
|
||||
nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(1));
|
||||
}
|
||||
|
||||
// 共有フォントの種類を取得
|
||||
//nn::pl::SharedFontType sharedFontType = nn::pl::GetSharedFontType();
|
||||
|
||||
// 共有フォントデータのアドレスを取得
|
||||
void* pFontBuffer = nn::pl::GetSharedFontAddress();
|
||||
|
||||
InitFont(&font, pFontBuffer);
|
||||
|
||||
// 描画リソースの構築
|
||||
drawerBuf = InitShaders(&drawer);
|
||||
|
||||
// 描画文字列用バッファの確保
|
||||
pDrawStringBuf0 = AllocDispStringBuffer(1024);
|
||||
pDrawStringBuf1 = AllocDispStringBuffer(512);
|
||||
|
||||
writer.SetDispStringBuffer(pDrawStringBuf0);
|
||||
writer.SetFont(&font);
|
||||
SetupTextCamera(&drawer, NN_GX_DISPLAY0_WIDTH, NN_GX_DISPLAY0_HEIGHT);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SharedFontFinalize()
|
||||
{
|
||||
drawer.Finalize();
|
||||
|
||||
// 描画リソースの破棄
|
||||
appHeap.Free(drawerBuf);
|
||||
|
||||
// フォントの破棄
|
||||
CleanupFont(&font);
|
||||
|
||||
// 描画文字列用バッファの解放
|
||||
appHeap.Free(pDrawStringBuf1);
|
||||
appHeap.Free(pDrawStringBuf0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
End of file
|
||||
*---------------------------------------------------------------------------*/
|
||||
@ -1,30 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef GUI_SHFNT_H_
|
||||
#define GUI_SHFNT_H_
|
||||
|
||||
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_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();
|
||||
|
||||
#endif
|
||||
@ -1,110 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: sleep.cpp
|
||||
|
||||
Copyright (C)2010 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <nn/applet.h>
|
||||
|
||||
#include "sleep.h"
|
||||
|
||||
//extern nn::os::CriticalSection g_SleepCS;
|
||||
extern nn::os::LightEvent g_TransitionEvent;
|
||||
extern nn::os::LightEvent g_AwakeEvent;
|
||||
|
||||
volatile bool SleepHandler::s_IsAfterWakeUp = false;
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
void SleepHandler::Initialize( void )
|
||||
{
|
||||
nn::applet::SetSleepQueryCallback(SleepQueryCallback, 0);
|
||||
nn::applet::SetAwakeCallback(AwakeCallback, 0);
|
||||
// nn::applet::SetSleepCancelCallback(NULL, 0); // CancelCallback は使わないことを推奨します
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
void SleepHandler::Finalize( void )
|
||||
{
|
||||
nn::applet::SetSleepQueryCallback(NULL, 0);
|
||||
nn::applet::SetAwakeCallback(NULL, 0);
|
||||
|
||||
nn::applet::DisableSleep();
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
システムスリープの指示が来ているかどうかを返します。
|
||||
*------------------------------------------------------------------------*/
|
||||
bool SleepHandler::IsSleepRequested( void )
|
||||
{
|
||||
if ( nn::applet::IsExpectedToReplySleepQuery() )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
本体スリープ状態に移行させるための処理を行います。
|
||||
グラフィックスなどの処理がスリープに入っても問題ない
|
||||
適切なタイミングで呼び出す必要があります。
|
||||
*------------------------------------------------------------------------*/
|
||||
void SleepHandler::SleepSystem( void )
|
||||
{
|
||||
// SleepHandler::IsSleepRequested() == true における呼び出しが前提
|
||||
|
||||
// 何らかの理由で SleepQuery に対して REJECT を返す場合は、ここで判定して
|
||||
// REJECT を返し、この関数を抜ける
|
||||
|
||||
// ファイルシステム処理中はスリープをしない
|
||||
//if ( g_SleepCS.TryEnter() )
|
||||
{
|
||||
// スリープ前処理
|
||||
|
||||
nn::applet::ReplySleepQuery(nn::applet::REPLY_ACCEPT);
|
||||
|
||||
g_AwakeEvent.Wait();
|
||||
|
||||
// スリープ復帰時の処理
|
||||
|
||||
// g_SleepCS.Leave();
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
スリープ問い合わせ時に呼ばれるコールバック
|
||||
*------------------------------------------------------------------------*/
|
||||
AppletQueryReply SleepHandler::SleepQueryCallback( uptr arg )
|
||||
{
|
||||
NN_UNUSED_VAR(arg);
|
||||
g_AwakeEvent.ClearSignal();
|
||||
|
||||
if ( !nn::applet::IsActive() )
|
||||
{
|
||||
// Inactive なとき、メインスレッドは applet::WaitForStarting() で停止状態であり、
|
||||
// 他のスレッドも停止状態になっているはず(アプリケーション側の実装依存)
|
||||
return nn::applet::REPLY_ACCEPT;
|
||||
}
|
||||
else
|
||||
{
|
||||
return nn::applet::REPLY_LATER;
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
スリープ復帰時に呼ばれるコールバック
|
||||
*------------------------------------------------------------------------*/
|
||||
void SleepHandler::AwakeCallback( uptr arg )
|
||||
{
|
||||
NN_UNUSED_VAR(arg);
|
||||
g_AwakeEvent.Signal();
|
||||
|
||||
s_IsAfterWakeUp = true;
|
||||
}
|
||||
@ -1,46 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: sleep.h
|
||||
|
||||
Copyright (C)2010 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef NN_SAMPLE_DEMOS_DEMO2_SLEEP_H_
|
||||
#define NN_SAMPLE_DEMOS_DEMO2_SLEEP_H_
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
本体スリープに関連する処理
|
||||
*------------------------------------------------------------------------*/
|
||||
class SleepHandler
|
||||
{
|
||||
public:
|
||||
SleepHandler() {}
|
||||
~SleepHandler() {}
|
||||
|
||||
static void Initialize( void );
|
||||
static void Finalize( void );
|
||||
static bool IsSleepRequested( void );
|
||||
static void SleepSystem( void );
|
||||
|
||||
static AppletQueryReply SleepQueryCallback( uptr arg );
|
||||
static void AwakeCallback( uptr arg );
|
||||
static void CancelCallback( uptr arg );
|
||||
|
||||
// スリープからの復帰後、1フレーム分描画を待ってから LCD を有効にするためのフラグ
|
||||
static volatile bool s_IsAfterWakeUp;
|
||||
|
||||
private:
|
||||
static nn::os::LightEvent s_AwakeEvent;
|
||||
static bool s_IsInitialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // NN_SAMPLE_DEMOS_DEMO2_SLEEP_H_
|
||||
@ -1,22 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: irp.h
|
||||
|
||||
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Rev$
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef VER_H_
|
||||
#define VER_H_
|
||||
|
||||
#define VERSION 1.04
|
||||
|
||||
|
||||
#endif
|
||||
@ -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 .. カードが見つからない
|
||||
|
||||
@ -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からインポート -> 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作成は飯島さんに聞く
|
||||
@ -1,10 +0,0 @@
|
||||
<インポータのオプション有効化>
|
||||
|
||||
cms_inf.txtの名前でファイル作成
|
||||
以下の記述でオプションが有効になる
|
||||
|
||||
-t: テストメニュー
|
||||
カード上のセーブにテストパターン書き込み&ベリファイ
|
||||
|
||||
-p: 本体シリアルを表示
|
||||
|
||||
@ -1,55 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////
|
||||
本ツールは 「Nintendo for 3DS」および専用カード用です
|
||||
カード上のセーブデータをバックアップ及びリストアします
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
NANDインポートしてから、内臓アプリ同様の手順で起動
|
||||
本体システム2.0以降にしておく
|
||||
CUP版(v1.02以降)は本体システムが古い場合自動更新メニュー起動
|
||||
ただし、UPP(?)はHomeメニュー起動でないと使えない
|
||||
|
||||
(インポート手順)
|
||||
・デバッガもしくはライタで"cci"をカードに書き込む
|
||||
・Homeメニューよりカード起動しメニューからInport実行
|
||||
・メニューのImportを選ぶ
|
||||
・終了したら電源ボタンを短押し ->"電源を切る"をタッチ
|
||||
電源を入れなおさないとアイコンがメニューに現れません
|
||||
|
||||
|
||||
(NANDから削除)
|
||||
起動まではインポートと同様
|
||||
・メニューからDelete実行
|
||||
終了後はメニューに戻ります
|
||||
|
||||
(テストパターン書き込み)
|
||||
カード上のバックアップにテストデータを書き込みます
|
||||
手元に使えるゲームカードが無い場合の動作確認用です
|
||||
起動まではインポートと同様
|
||||
・デバッガもしくはライタで"cci"をカードに書き込む
|
||||
・カードを本体に差しメニューからTest Data実行
|
||||
・カーソルで内容を選択、Aでライト、Xでベリファイ
|
||||
種別はCasual Test を選ぶ、他はリリース時のチェックに使う程度
|
||||
|
||||
<テスト手順>
|
||||
ライト後に一旦終了してHomeメニューにもどり
|
||||
Nand上のツールを起動し、リード&リストア
|
||||
Homeボタンなどでツール終了、カード起動しベリファイ
|
||||
|
||||
|
||||
ツール本体の操作は操作マニュアル参照
|
||||
|
||||
|
||||
[Histry]
|
||||
#表示ver マスタリング時のver
|
||||
# 変更内容
|
||||
|
||||
v1.04 - Remaster 2.0.9 - svnリビジョン 190
|
||||
body,imp: アイコンを?に変更:初期メニューのバグでフラグで拒否しても履歴に見えてしまう
|
||||
動作中の無線停止
|
||||
|
||||
v1.03 - Remaster 2.0.8 - svnリビジョン 181
|
||||
body: "LEFT+X"同時押を4秒押し続けに変更
|
||||
タッチ判定の調整
|
||||
imp: インポート先を本体シリアル番号で制限
|
||||
設定ファイルでオプション有効化するようした
|
||||
SDK2.0+ロンチメニューで動作確認
|
||||
@ -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)
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
|
||||
<操作メニュー>
|
||||
|
||||
操作が出来る状態のとき下画面にボタン表示
|
||||
|
||||
・バックアップが無い状態でカードを差すと
|
||||
バックアップが有効
|
||||
|
||||
・バックアップがある状態では
|
||||
リストアが有効
|
||||
|
||||
(バックアップ)
|
||||
タッチして実行画面
|
||||
カードから本体内メモリに読み出します
|
||||
|
||||
(リストア)
|
||||
タッチして実行画面
|
||||
バックアップした内容をカードへ書きます
|
||||
成功すると自動で消去
|
||||
失敗の場合は消去しません
|
||||
|
||||
(バックアップデリート)
|
||||
先頭画面で 方向キー LEFT + X 同時押し
|
||||
|
||||
|
||||
|
||||
以下、ビルド時にフラグ有効(my_dess.h 内)にした場合のみ使える
|
||||
|
||||
//クラッシュモード
|
||||
書き戻す際にデータを壊す、ベリファイで必ずエラー
|
||||
先頭画面で Y ボタン
|
||||
|
||||
//デバグモード
|
||||
先頭画面で 方向下+Y(0.09まで)
|
||||
先頭画面で 方向下+X+Y(1.00以降)
|
||||
|
||||
クラッシュモード有効時: L ボタン
|
||||
|
||||
//テストデータ書き込み
|
||||
デバグモード中に先頭画面でRボタン
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
|
||||
ビルド時に組み込んだ公開鍵のペアとなるプライベート鍵を使って署名を行う
|
||||
|
||||
バージョンで鍵を識別する
|
||||
鍵変更だけの場合でもバージョンを変えること
|
||||
|
||||
Openssl.exe : cygwinのインスト、Win版がある
|
||||
RSA鍵、ビット長は2048のみ
|
||||
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から読む
|
||||
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫ф8ф8фШчГГГГГГВ╫В╫8фВ╫В╫В╫В╫В╫ГГГГшчфГШФВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫yнВ╫yнВ╫В╫В╫В╫В╫YнВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫ГГГГШчyнYнВ╫шчшчВ╫В╫фВ╫В╫шчyнШчВ╫yнГГГГyнШФГГГГГшчВ╫В╫В╫В╫YнГyнГВ╫В╫В╫В╫В╫yнфшчГШФГYнyнВ╫В╫В╫yнВ╫╨жВ╫В╫В╫В╫В╫yнВ╫yнВ╫В╫В╫В╫В╫YнВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫yнГYнГВ╫В╫В╫В╫В╫фВ╫В╫ГyнГ8фВ╫В╫В╫В╫фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫
|
||||
@ -1 +0,0 @@
|
||||
В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫YнВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫8фВ╫В╫8ф8фВ╫В╫В╫╨ж8ф╨жГГшчГГГГГГГГГГГГГГГГГГГГГГГВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫8ф8фВ╫В╫фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫ГГГГГШФГГГГГГГГГГ жфГГВ╫В╫ жВ╫ГГГГГ жГГВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫8фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫шчВ╫шчВ╫В╫В╫В╫В╫ГВ╫ШчВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫╨жВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫ГГГГГГГГГГГГГГГГГГШФ8фШчшчВ╫В╫ жВ╫YнВ╫В╫В╫В╫В╫ГГYнyнГГyнфВ╫В╫В╫В╫В╫В╫В╫В╫фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫шчшчГшчШФВ╫В╫ГГYнГВ╫В╫В╫В╫В╫шчВ╫шчГГГГГГГГГГГГГГГГВ╫В╫YнШч жГГГГГГГГГГГГГГГГГГГГГГГГшч╨жВ╫ жВ╫шчВ╫В╫В╫В╫В╫ШФВ╫ШФВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫шчВ╫yнВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫YнВ╫ жГГГГВ╫шчВ╫шчГГГГВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫8фВ╫В╫╨жшчВ╫В╫В╫В╫В╫YнфyнГГГГГГГГГ жГГГГ╨жВ╫YнВ╫ШФYнВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫шч жВ╫В╫В╫В╫В╫В╫yнВ╫ГШФВ╫В╫фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫ШФВ╫ГГГГГВ╫ШчВ╫YнГГШФГВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫8фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫ГГГГ жВ╫шчВ╫ГГГшч жВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫8фВ╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫В╫
|
||||
Loading…
Reference in New Issue
Block a user