めもめも


○PSPのセーブデータについて

PSPのセーブデータは、基本的にPSPシステムが管理しており、データは暗号化されています。
現時点(2006/01)でシステム内部での扱い方（パラメータ構造体）には３つの形式が確認されており、データ自体としては２つの形式（PARAMSタイプ）があります。
新しいシステムでは、古い形式も使えます。

構造体サイズ  PARAMSタイプ  PSPシステム  
  0x5c8          0x01          1.00-     
  0x5dc          0x01          1.50-     
  0x600          0x21          2.00-     

2.00以降に出荷されたソフトで使われている新形式（PARAMSタイプ21）では、ゲーム毎に異なる暗号鍵（ゲームキー; gamekey）がなければ復号化も暗号化もできません。
2.00を要求するソフトでも、一部のソフトではPARAMSタイプ01が使われています。
らぼこでは、いくつかのゲームについてgamekeyを内蔵しています。

暗号がなんとかなればすぐにセーブデータを変更できるのかといえば、そうではありません。さらにゲーム側でチェックサムなどでの破損チェックをしている場合があります。
破損チェックをしている場合、らぼこでデータを変更すると、ゲームからセーブデータをロードした時点で「ファイルが壊れています」などのメッセージが表示されます。
XMBの「セーブデータ」では「破損データ」とならないけど、ゲームからは認識できない状態になってしまうわけです。このようなゲームに対応するためには、破損チェックを突破する
方法を考えないとダメ。たとえばモンスターハンターポータブル。らぼこでは、チェックコードを保存時に自動生成しています。

また、PSPシステムの暗号化だけじゃなくて、ゲーム側でも独自に暗号化していることも。そうなると、その暗号にも対応しないとダメ。Ysなど。らぼこではまだ対応していません。

このような症状でうまく改造できないゲームがあったら、ゲームラボ編集部まで教えてね。対応できるとは限りませんが。



○コード形式

らぼこのコードは機械語の命令のようなものになっています。コードの解釈は４ビットCPUみたいなものが行うと思って下さい。
全て１６進数で表記します。

＜らぼこのコード＞  ::=  ＜命令＞  ＜命令＞  ...

各命令は、１つのオペコード（処理内容）と、複数のオペランド（処理に使うデータ）からできています。オペランドは無い場合もあります。

＜命令＞  ::=  ＜オペコード＞ ［ ＜オペランド＞ ［ ＜オペランド＞ ［ ... ］ ］ ］

オペコードは現在３種類だけ＞＜

  オペコード   処理                     オペランド
  0            なにもしない             なし
  1            データ書き込み           ２つ：アドレス・データ
  20           シリアルコード           ５つ：始点アドレス・開始データ・アドレス増分・データ増分・繰り返し回数

オペランドは、現在のところ値（即値）の指定のみ可能です。

  オペランド１桁目   続く桁数          説明
  0                  0                 0  (bit)
  2                  1                 ニブル値  (nibble)      ※ニブルというのは４ビット
  3                  2                 バイト値  (byte)        ※８ビット
  4                  4                 ショート値  (short)     ※１６ビット
  5                  8                 ロング値  (long)        ※３２ビット

オペランドの例はこんな感じ。

  オペランド         値
  0                  0  (bit)
  23                 0x3  (nibble)
  345                0x45  (byte)
  45678              0x5678  (short)
  56789abcd          0x6789abcd  (long)

命令はこんな感じになります。

 0                              なにもしない
 13aa0                          アドレス aa にデータ 00 を書き込み。
 14aaaa3dd                      アドレス aaaa にデータ dd を書き込み。
 14aaaa4xxyy                    アドレス aaaa から、バイト値 yy xx を順次書き込み。
 15aaaaaaaa4xxyy                アドレス aaaaaa から、バイト値 yy xx を順次書き込み。
 14aaaa5xxyyzzww                アドレス aaaa から、バイト値 ww zz yy xx を順次書き込み。
 204aaaa3dd3bb3ee3cc            アドレス aaaa を開始アドレス、データ dd を開始データ、bb をアドレス増分、eeをデータ増分として、cc回繰り返して書き込み

データはLSB firstで書き込みます。
オペコード１では、データはバイト単位に切り上げされます。
シリアルコードでは、開始データ・データ増分は byte, short, longのいずれかで、一致してないとダメ。繰り返し回数は1から0x1000まで。

いままでのを合わせると、こうなります。

 100                            アドレス 0 にデータ 00 を書き込み。
 1420205000f423f                アドレス 2020 にデータ 000f423f を書き込み。  2020<-3f, 2021<-42, 2022<-0f, 2023<-00
 204123431021301320             開始アドレス 1234 、開始データ 10 、アドレス増分 1 、データ増分 01 、回数 20 回繰り返し書き込み

全部つなげてもOKです。たぶん。

 1001420205000f423f204123431021301320
    アドレス 0 にデータ 00 を書き込みして、
    アドレス 2020 にデータ 000f423f を書き込みして、
    開始アドレス 1234 、開始データ 10 、アドレス増分 1 、データ増分 01 、回数 20 回繰り返し書き込みする。

シリアルコードでは、開始データ・データ増分は byte, short, longのいずれかで、一致してないとダメなので注意です。
データのところに 0 や nibble を使ったり、開始と増分でタイプが違ったりするとエラーになっちゃいます。



○SHコード（ハッシュコード）について

コード入力時、登録コードから選択時に、SH0000みたいなのが表示されます。これは、各コードのハッシュになっています。
16ビットしかないので衝突（別のコードで同じハッシュになっちゃう）したりもしますが、まぁそれは我慢ですね。
このハッシュコードは、（現時点では）入力には使いませんが、なんかかんか使えるんじゃないかということで作ってみました。

改造コードとハッシュコードを併記することにより、入力誤りを減らしたり一覧から選択しやすくなったりするはずです。
ハッシュが衝突しちゃったけど、区別をつけるために違う値にしたいって時には、最後に 0 をつけると良いかもです。



