savファイル情報

「savファイル情報」の編集履歴(バックアップ)一覧に戻る

savファイル情報 - (2008/09/05 (金) 03:09:34) のソース

#contents
*スレで聞く前に
 fsutil file createnew xxx.sav 8388608
これをコマンドプロンプトで打ち込んで、8MB0埋めセーブデータを作る必要があります。

*sav基本構造
[[http://game14.2ch.net/test/read.cgi/gameurawaza/1214256294/597]]より
 ちょっと解析結果まとめ
 まず8MB.savを作成し、BBDXに読み込ませる。
 Wifi楽曲ダウンロードは直接ROMから保存先をしていされるのではなく
 楽曲を.savに書き込もうとするときにsavファイルにROMが書き込んだ文字列が、別チップに書き込むに指令をだすと仮定
 略図つttp://blog-imgs-21.fc2.com/w/h/i/white1024/BB.jpg
 savを解析。すると↓の結果が得られた
 sav内を解析した結果
 蘒 BBDX1234 9000 0,0 0ヒォ
 ア BBDX1234 1000
 9 BBDX1234 1000
 BBDX1234 0000
 s BBDX1234 9000 0,0 0ヒォ
 - BBDX1234 1000 @ ツ調按 エソ ツ調按 エソラ嶄 JBXA ・V
 という6種類のデータの保存先を指定しているっぽい文字列を発見
 .BBDX12341000.がセーブデータ保存領域と仮定し、.BBDX12349000.の9000のところを全て1000に置換
 そして起動
   ↓
 セーブデータがなくなる
   ↓
 1000はセーブデータ領域ではなかった。
 同様に1000を9000に置換
     ↓
 セーブデータは既存
     ↓
 どうやら9000はセーブデータ領域の可能性大
 最初にやれば良かったのだが0000が一番あやしい
 0000を9000に置換し起動
 楽曲ダウンロード
   ↓
 エラー
 とりあえず現段階ではここまでです。
 引き続き解析を進めます。これとは異なるなんらかの解析結果をお持ちのかたは是非提供してくれるとありがたいです。
 一応書いておきますが最初8MB.savを作った段階では残りDL曲数が18だったのだが9000や1000、0000を書き換えた状態だと2曲になる。指定先の誤りだと思われる。
 とりあえずやったことをまとめると
 1000を9000に置換
 9000を1000に置換
 0000を9000に置換
 です。
 やろうとしていること(やってないこと)
 1000,0000を9000に置換
 1000,9000を0000に置換
 0000,90000を1000に置換
 1000を0000に置換
 9000を0000に置換
 以上のことから
 セーブ領域は9000or0000
 wifi領域は0000or1000
 自作曲領域は1000
 だと考えられます。この値は更に解析することによって絞り込むことは可能です。
 当方、DSTTでYSMENU環境ですので環境によって違う結果がでる可能性もありますのでそのときは報告してくれるとありがたいです。

*セーブデータバイナリアドレス
 一度0埋めを作ってやり直したが、やはりこのゲームのセーブデータは8000(16進アドレスで)ごとに区切られていて、
 隣接するところに同じデータを書き込む仕様のようだ
 上4桁0000代がBBDX1234 9000部分×2、
 上4桁0001代がBBDX1234 0000部分×2、
 上4桁0002代がBBDX1234 1000部分×2。
 が、以降の上4桁0003~は自作曲領域の模様。
 で、この8000セクションは、その領域に何かを書き込むとFFでそのセクション全体が埋まるようだ
 自作曲領域は繰り返しなしかもしれないっぽ 
 
 上4桁0004代がBBDX1234 9000部分×2、
 上4桁0009代がBBDX1234 0000部分×2、
 上4桁000C代がBBDX1234 1000部分×2、
 上4桁000D代がBBDX1234 1000部分×2、
 上4桁0010代がBBDX1234 1000部分×2、
 上4桁0015代がBBDX1234 0000部分×2。
 
 その後、0018部分にBBDX1234 3000が二つ点在するが、本当の自作データ格納部分は004Bから007Cまでみたいだ 
 >>246
 R4だと、4B0000以降の"BBDX12343000"をヘッダに持つデータが自作曲っぽいね。
 
 あと、bbs2bdxで作ったbdxファイルにはヘッダが無いからbdxtoolにはじかれるっぽい 

*BBDX1234埋め
セーブデータの初期化を、00でもFFでもなくBBDX1234の繰り返しで埋めると、Wi-Fiでxxできる模様。(現在は不可)

*1バイト追加
8MBセーブデータに00のバイトを追加→セーブデータ自動修復でWi-Fiラジオのみxxできる(つまり、100曲DL済み状態)の模様。(現在は不可)

*DL曲のbdx化
[[http://game14.2ch.net/test/read.cgi/gameurawaza/1214927818/128]]
 128 :名無しさん@お腹いっぱい。 :2008/07/02(水) 13:08:55 ID:E0UcolYx 
 つーかさ、0x00190000からDL曲が100曲(0x004AFFFFまで)入ってる。 
 で、Edit曲が0x004B0000から100曲分格納可能。 
 つまりバイナリエディタで0x00190000~0x004AFFFFまでを0x004B0000以降に移してやれば 
 最新のbdxtoolでもDL曲をbdx化できる。 
 検証済みだ。 
 これで旧ツールくれくれの必要ないだろ。

*DL曲領域について
 128氏の方法でbdx化したDL曲(Aとする)を
 自作曲領域にインポートした後、
 バイナリエディタでDL曲領域のAと自作曲領域のAを比較すると
 中身が全然違うデータになっている。
 なので自作曲領域のAをDL曲領域にコピペしても未来予想図化けする。
 
 じゃあDL曲領域のバイナリデータなら自由にコピペ出来るかと思いきゃ
 そういう訳ではなく、
 DL曲領域の先頭と2番目の曲を入れ替えただけでもこの2曲は化ける。
 
 格納されている順番がどっかに記録されてる?
 
 逆に言えば別savのDL曲でも
 元と同じ位置(例えば先頭なら0x190000)にコピペすると化けない。
 これを利用して1-100.savその他から好きな曲のバイナリだけコピーして
 DL曲領域にまとめることが出来る。自作曲領域を空けたい人におすすめ。
 ただしアドレス位置がかぶっている曲は大人しくbdx出力して自作曲領域にインポートすべき。
 空いてしまった領域は全てFFで埋めれば、曲選択の際に余計な曲を挟まずに済む。

*自作枠とDL枠の曲を総入れ替えする(128氏自動化+未来予想図回避)
http://retropc.net/apollo/download/xm7/bincut/index.htmからbincutをDL
し、以下をswap.batにして保存する。

 echo. すわっぷまじっく
 bincut a.sav header.sav 0 18FFFF
 bincut a.sav DL.sav 190000 4AFFFF
 bincut a.sav 自作.sav 4B0000 7CFFFF
 bincut a.sav footer.sav 7D0000 7FFFFF
 copy/b header.sav + 自作.sav + DL.sav + footer.sav swap.sav
 del header.sav
 del 自作.sav
 del DL.sav
 del footer.sav

交換したいsavファイルをa.savにリネームしてさっき作ったbatを実行。
できたsaveを上の未来予想図回避のためdegauserv1.0bで読み込み保存する。起動して無事読めれば成功。
戻したいときはswap.savをまたa.savにリネームしてbat実行、再度degauserv1.0bで読み込み保存すればおk。#120小節越え譜面があるとエラーでできません。
成功時
#image(http://www31.atwiki.jp/bbdx1234?cmd=upload&act=open&pageid=14&file=zero_03195.jpg)

*純正カードリッジからセーブデータのバックアップ
皇帝氏のNDS Backup Tool Slot2 V0.31 MOD patch 
 00001264: 14 17
 00001270: 01 02
 00001271: 06 05
 000016A0: 14 17
 000016AC: 01 02
 000016AD: 06 05
 00001A54: 14 17
 00001A5E: 02 A0
 00001A5F: 02 03
 00001B6C: 14 17
 00001B78: 01 02
 00001B79: C6 C5

*BDXデータ構成
http://neobeo.threeplusfive.com/
の一番下のspecification、下機械翻訳

 最初の0x48バイトはSAV専用のヘッダーです。
 そのあとROMイメージをNDSTOOLで分解してできるGAKファイルが続きます。
 サンプルは残酷な天使のテーゼ

 詳細,オフセット,サイズ,サンプル,説明

 CRC16,0x0000,4,0xAB08B27C,チェックサム

 署名,0x0004,8,"BBDX1234","Band,Brothers,DX,1234"

 ID,0x000C,4,"3000",Always,"3000",for,a,record.

 スロット可否?,0x0010,4,0x80000001,使用=0x80000001,未使用=0,

 LZSS圧縮のサイズ,0x0014,4,0x00001AF1,LZSSで圧縮されたデータサイズ,(GAKデータはsavでは圧縮されます),

 HMAC-SHA1,0x0018,20,76-DF-E5-29-A6-EE-…,20バイトチェックサム、bdxでは0

 歌詞関連?,0x002C,20,BC-BC-BB-DE-CF-A4-…,カラオケに関連がある?

 不明,0x0040,4,0x00000000,0x00000000~0x00000044の値?,

 不明,0x0044,4,0x000000FF,いつも0x000000FF

 ----------------------------------
 次の0x1A0バイトはGAKのヘッダーです

 CDのラベルライン1 ) 0x0048 32 "ざんこくなてんしの"の最初の行のCDラベルテキストのエンコーディングを参照)

 CDのラベルライン2 ) 0x0068 32 "テーゼ" 、 CDのラベルの2行目です。空白行が1行の場合の値= 0x10

 CDのラベル3号線) 0x0088 32 " " 3行目のCDラベルです。空白行が1行の場合の値= 0x10

 パディング0x00a8 2 0x0000を常にゼロ

 0x00aa 1時間署名0x04 0x03 = 3 / 4または0x04 = 4 / 4

 0x00ab 1小節のカウント0x5f減算6実際の小節のカウントを取得するには、 0x5f - 6 = 89

 0x00ac 1 0x00のパディング常にゼロ

 測定関連?不確かな値0x00ad 1 0x5a ;のいずれかまたは5に等しい未満の最初の小節のカウント

 主な楽器0x00ae 1 0x00のインデックスをメイン楽器0 ~ 7 ) 、 -1ていない場合はメイン音源

 カラオケ? 0x00af 1が0x01 0x01の場合にはカラオケ、 0x00の他の

 日付不明)を0x00b0 4日の16進= 0x20080116この場合、 2008年1月16日

 カスタム関連? 0x00b4 1 0x01に不明な値;可能性が0x01の場合、カスタム、および0x00の場合の公式

 未知の0x00b5 2 0x0000を未知の値0x0000を私は見ただけ、 0x0001 、 0x0100

 マスターボリューム0x00b7 1 0x40の範囲は0 50 % )を0x7Fエラーが発生する150 % ) 。通常は0x40 100 % )

 レコード番号0x00b8 4 0x0000356eレコード番号= 28213この場合です。できる前のn * 10 ^ 9

 作成日0x00bc 3 0x190608日= 2008年6月19日この場合には、影響を与えるように"はカラオケ"

 カスタム関連? 0x00bf 1 0x00の不確かな値;可能性が0x00の場合、カスタム、および0x01の場合の公式

 更新日時0x00c0 3日= 0x1a0608この場合、 2008年6月20日

 カスタム関連?不確かな値0x00c3 1 0x02 ;可能性が0x02の場合、カスタム、および0x00の場合の公式

 パディング0x00c4 4 0x00000000 、常にゼロ

 instrheader1 [ 8 ] 0x00c8 16 × 8 個々の部品を参照 )音源ヘッダーをそれぞれの8部品

 0x00c8 2巻 0x0060の範囲は0から、おそらく0x7Fエラーが発生します。

 サウンドバンク 0x0088サウンドバンク136 = 0x00ca 2スクエアリードこの場合健全な銀行を参照)

 パン 0x00cc 1 0x07 - 0x80をより完全な範囲のPANを左右0x7Fエラーが発生する完全なパン

 マスター評価 0x00cd 0.5 0x7星印の数マスターの難しさ

 プロの評価 0x00cd 0.5 0x5星印の数プロの難しさ

 クローンのインデックス 0x00ce 1 0x00のインデックス楽器の名前が表示されますつまりピアノ3 ) 、 0他の

 アマチュアの評価 0x00cf 0.5 0x4星印の数アマチュアの難しさ

 初心者評価 0x00cf 0.5 0x2星印の数ビギナーの難しさ

 パディング 0x00d0 8 0x00000000 、常にゼロ

 カスタム関連? 0x0148 2 0x0000を不確かな値;可能性が0x00の場合、カスタム、および0x10の場合の公式

 文字列の長さ0x014a 2 0x000A発生は、次の寄稿者の文字列の長さを、パスカル-スタイル

 寄稿者0x014c 156 "ゲーマガ♪ウメ"コメント数: 156 、非同盟の長さは、不審な

 --------------------------------------------
 SAV上ではLZSSで圧縮されます。ここでは無圧縮時

 instrheader2 [ 8 ] 0x1e8 12 × 8 個々の部品を参照 )正直なところ、私はなぜ表示されていないことはないのヘッダーに結合さギャック

 攻撃 0x1e8 1 0x61攻撃

 崩壊 0x1e9 1 0x14崩壊

 維持 0x1ea 1 0x3cを維持

 発売 0x1eb 1 0x28発売

 形 0x1ec 1 0x01の形状

 保留 0x1ed 1 0x0fホールド

 崩壊 0x1ee 1 0x14崩壊

 深さ 0x1ef 1 0x32の深さ

 速度 0x110 1 0x14速度

 パディング 0x111 1 0x00の常にゼロ

 エフェクターのタイプ 0x112 1 0x03エフェクターの種類正弦波/スクエア/のこぎり/等)

 エフェクター値 0x113 1 0x12エフェクターの値0 ~ 20 )

 musicalnotes [ 8 ] 0x248 2048 × 8 個々の部品を参照 )

 ノート[ 4096 ]  0x248 2048 48 - c8 - c8 - c8 - 4b - cb - …を使用するほとんどの1920バイト、法的にします。 ミュージカルノートを参照)

 tempochange [ 32 ] 0x4248 4 × 32 個々の部品を参照 )

 ダニの位置 0x4248 2 0x0000の位置をタイマーでダニ、 0xFFFFの意味の他のテンポの変更

 テンポの値 0x424a 2 0x0050テンポを設定この場合は0x0050 = 80

 otherchange [ 8 ] 0x42c8 8 × 32 × 8 個々の部品を参照 )

 otherstruct [ 32 ]  0x42c8 8 × 32 ({{{{個々の部品のいずれか}}}}!)ボリューム、またはキー署名、オクターブの範囲、和音等)を変更

 ダニの位置  0x42c8 2 0x0000の位置をタイマーでダニ、 0xFFFFの意味の他のテンポの変更

 キーの値  0x42ca 2オクターブの範囲0xfd3cいくつかの重要な署名

 巻  0x42cc 2 0x007f新しいボリュームをセット0x007f = 127この場合、

 変更のタイプ  0x42ce 2 0x0000を0x0000の意味体積変化、 0xですか?ですか?ですか?ですか?キーを変更する手段

 originalchord [ 16 ] 0x4ac8 4 × 16

 chorddata  0x4ac8 4ビットフィールドに応じて分割さ0x00000000かどうかは、ピアノやギターの弦

 toinvestigate 0x4b08 768 個々の部品を参照 )のいずれかのグループ4またはグループの12
 
*小ネタ
**半角英数について
BBDX内で英数を打ち込むと、バイナリでは
 xx 00 yy 00 zz 00 ...
となります。これを、
 xx yy zz ... 00 00 00 ...
と書き換えると、半角英数に見えます