ps2と戯れてみる その1

bbunitを入手したのですが、fmcb導入前にメモカ仕様が良く分かっていないので戯れてみる。

とりあえず、ハドフでCECHZM1とSCPH-10020を入手。



中身を見てみる。
---------- Filename ----------  |  Type  | Last Modification (UTC)
BIDATA-SYSTEM                   | <dir>  | 11/18/2013-00:42:39
BISLPS-20030SHANGHAI            | <dir>  | 11/02/2006-20:40:18
BISLPM-62474KANJI               | <dir>  | 07/21/2007-14:09:10
BISLPSP02227THEBLOCK            | <dir>  | 11/05/2007-15:10:50
BISCPS-15015                    | <dir>  | 02/18/2002-14:43:01

前の持ち主さん、フォーマットせずにハドフへぶっこんだらしく。
普通、フォーマットなんてしないか。
上海とかブロック崩しとか、そんな感じの持ち主さんですね。

PS2 Memory Card format
Formating MC...
Memory card succesfully formated.

という訳でフォーマット。

我が家のメモカを見てみる。
---------- Filename ----------  |  Type  | Last Modification (UT
BIDATA-SYSTEM                   | <dir>  | 03/21/2014-23:26:38
BISLPM-65888dq8_0               | <dir>  | 06/18/2009-11:25:11
BISLPM-65888dq8_1               | <dir>  | 06/19/2009-16:17:40
BISLPM-65888dq8_2               | <dir>  | 09/24/2005-17:05:23
BISLPM-65888dq8_3               | <dir>  | 09/23/2005-16:22:13
BISLPM-65888dq8_4               | <dir>  | 09/24/2005-01:33:37
BISLPM-65888dq8_5               | <dir>  | 11/23/2011-20:52:57
BISLPM-66375OKAMI000            | <dir>  | 11/12/2010-15:32:49
BISLPM-66375OKAMI001            | <dir>  | 03/08/2014-00:22:09
BISLPS-25050FF042800            | <dir>  | 03/21/2014-23:44:13
BISLPS-25050FF042801            | <dir>  | 03/13/2014-23:21:26
BISCPS-11003ico                 | <dir>  | 01/14/2014-21:40:32

ドラクエ8、大神、ico、ffxが見えます。

とりあえず、フォーマットしたメモカをps2に装填。
ps2管轄に入ると

BIDATA-SYSTEM                   | <dir>  | 03/22/2014-17:05:49

こんな感じ。



で、例えば、カプクラでセーブすると

BIDATA-SYSTEM                   | <dir>  | 03/22/2014-17:05:49
BISLPM-66317                    | <dir>  | 03/22/2014-17:06:53

こんな感じ。

BIDATA-SYSTEM配下
---------- Filename ----------  |  Type  | Last Modification (UTC)
history                         | <file> | 03/22/2014-17:05:48
icon.sys                        | <file> | 03/22/2014-17:05:49

因みに、カプクラセーブデータ配下
---------- Filename ----------  |  Type  | Last Modification (UTC)
icon.sys                        | <file> | 03/22/2014-17:06:50
static.ico                      | <file> | 03/22/2014-17:06:51
BISLPM-66317                    | <file> | 03/22/2014-17:06:53

なるほど。
あーそうだ、ps1系でセーブやってみないとな。

パラッパラッパを1セッションしてセーブしてみると、
「メモリカードがささってないよ」
って怒られる。
ps1のセーブデータがps2メモカに保存出来ないなんて知りませんでした。
え?と、ps1メモカを装填してセーブ再施行すると完了。
おぉ、そうなんだ。

調べてみると、ps1メモカからps2メモカへのコピーがps2上で出来るらしい。
単純に間借りするだけですが。

それが、こちら。
---------- Filename ----------  |  Type  | Last Modification (UTC)
BIDATA-SYSTEM                   | <dir>  | 03/22/2014-19:08:29
BISLPM-66317                    | <dir>  | 03/22/2014-17:06:53
BISCPS-18002A                   | <dir>  | 03/22/2014-19:06:28

パラッパラッパ(SCPS-18002)のセーブデータが保存されています。

BIDATA-SYSTEM配下
---------- Filename ----------  |  Type  | Last Modification (UTC)
history                         | <file> | 03/22/2014-19:08:28
icon.sys                        | <file> | 03/22/2014-19:08:29

ちょっとhistoryに操作しているかは謎ですが、タイムスタンプは更新されています。
サイズが見れていないので実際は不明。

BISCPS-18002A配下
---------- Filename ----------  |  Type  | Last Modification (UTC)
BISCPS-18002A                   | <file> | 03/22/2014-19:06:28

単純な複写なので、ps1メモカのセーブデータ仕様のまま。

今日眺めた感じでは、メモカブの突き方は不明ですね。
次回はhistoryファイル内容ですね。

更新日時がUTCとか表記されていますが、思いっきりJSTですね。

有益な情報はこちら

sc-04d 4.4

sc-04dは正式に4.4から切り捨てられました。

ので。

cm11を導入してみました。



やはり、sc-04dは、遊ぶ端末としては最高だと思うのです。

SO-01D その6

というか。

舐めてリッピング機能付けるとか息巻いてしまい、
それならば一層のこと、ROM2やらMCDも対処してしまおうと。

で。

とりあえず、ROM2からやってしまおうかと以下の手順。

1.TOC奪取
2.TOC舐め
3.オーディオトラックならばRawReadからWaveファイル化
4.データトラックならばRawReadからIsoファイル化

とか。

3までは順調だったのです。1日くらいで。
データトラックがどうしても読めない。
読めないというか、DeviceIoCtrlがINVALID_FUNCTIONを返してくる。
ディスクオフセットやセクタ数、読み出しバッファは、オーディオトラックで
実績があるのでバグが考え難い。
結局のところ、TrackModeが怪しいんじゃないのかちゅうことで、XAForm2から
別のRaw系に切り替えたら、今度はパラメタエラー。
あー、そいや、ROM2のデータトラックて、XAと思い込んでいるけど、本当?
て、調べてみたら、どうやらMODE1みたい。

ぎゃふん。

MODE1だと、デフォで対応していないので、すかじ生こまんど(0xBE)発行するしかない。

こんな面倒ならやるんじゃなかった。


ROM2のすーだらちゃん読み込んだところ。

該当するすかじこまんど仕様。
http://www.13thmonkey.org/documentation/SCSI/x3_304_1997.pdf

SO-01D その5

zpakの解析

■ metadata.xml
当たり前の差分

■ manual
当たり前の差分

■ data
- image.ps
 rom image
 当たり前の差分
- ps1_rom.bin
 これ、biosのはずなんだけど差分が出てしまっている。
 いやぁ、なんか香ばしいな。

雑感として、なんちゅうか構造も然ることながら、全体的に混沌としています。
被ったリソースが幾重にも出現してくると反吐が出ますね。

FPseで遊ぶ方がよほど効率的だと思うのですが、ある意味、こちらも面白い。
面白いついでに、psxperiaでも読み解こうかなと思います。

boot log

10-14 07:02:42.375: I/ActivityManager(235): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.sony.playstation.NCJA10031_1/com.sony.android.psone.BootActivity bnds=[238,273][351,431] } from pid 345
10-14 07:02:42.435: I/ActivityManager(235): Start proc com.sony.playstation.NCJA10031_1 for activity com.sony.playstation.NCJA10031_1/com.sony.android.psone.BootActivity: pid=1327 uid=10088 gids={3003, 1015}
10-14 07:02:42.495: I/WindowManager(235): Setting rotation to 1, animFlags=1
10-14 07:02:42.515: I/ActivityManager(235): Config changed: { scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=2/2 orien=2 layout=34 uiMode=17 theme=ComponentInfo{com.sonyericsson.defaultruntimethemes/com.sonyericsson.defaultruntimethemes.BlueThemeService} seq=4}
10-14 07:02:42.685: D/dalvikvm(1327): Trying to load lib /data/data/com.sony.playstation.NCJA10031_1/lib/libzplatform.so 0x2afc6fd8
10-14 07:02:42.755: D/dalvikvm(1327): Added shared lib /data/data/com.sony.playstation.NCJA10031_1/lib/libzplatform.so 0x2afc6fd8
10-14 07:02:42.755: D/dalvikvm(1327): No JNI_OnLoad found in /data/data/com.sony.playstation.NCJA10031_1/lib/libzplatform.so 0x2afc6fd8, skipping init
10-14 07:02:42.765: D/dalvikvm(1327): Trying to load lib /data/data/com.sony.playstation.NCJA10031_1/lib/libjava-activity.so 0x2afc6fd8
10-14 07:02:42.895: D/dalvikvm(1327): Added shared lib /data/data/com.sony.playstation.NCJA10031_1/lib/libjava-activity.so 0x2afc6fd8
10-14 07:02:42.915: E/Source/WhiteBox/TfitProtectedTransform.cpp(1327): TFIT_Engine_CreateTransform 7ED25480 2127713608 2CBFFC74 7ED25340
10-14 07:02:42.965: I/ActivityManager(235): Start proc com.sonyericsson.android.preinstalledservice for service com.sonyericsson.android.preinstalledservice/.PreinstalledLicensingService: pid=1335 uid=10131 gids={}
10-14 07:02:43.025: I/ActivityManager(235): Displayed com.sony.playstation.NCJA10031_1/com.sony.android.psone.BootActivity: +589ms
10-14 07:02:43.105: D/dalvikvm(1335): Trying to load lib /data/data/com.sonyericsson.android.preinstalledservice/lib/librsasigner.so 0x2afc6970
10-14 07:02:43.115: D/dalvikvm(1335): Added shared lib /data/data/com.sonyericsson.android.preinstalledservice/lib/librsasigner.so 0x2afc6970
10-14 07:02:43.115: I/native rsasigner(1335):  JNI_OnLoad!
10-14 07:02:43.115: I/native rsasigner(1335):  clazz is NOT NULL
10-14 07:02:43.195: W/IInputConnectionWrapper(345): showStatusIcon on inactive InputConnection
10-14 07:02:43.225: I/ActivityManager(235): Start proc com.sonyericsson.semcsuite for broadcast com.sonyericsson.semcsuite/.ui.PackageIntentReceiver: pid=1342 uid=1000 gids={3002, 3001, 3003, 1007, 1015}
10-14 07:02:43.225: I/ActivityManager(235): No longer want com.sonyericsson.androidapp.fbmusiclike (pid 1174): hidden #16
10-14 07:02:43.315: I/ActivityThread(1342): Pub com.sonyericsson.semcsuite.search.SuggestionProvider: com.sonyericsson.semcsuite.search.SearchSuggestion
10-14 07:02:43.315: I/ActivityThread(1342): Pub com.sonyericsson.semcsuite.data.GameContentProvider: com.sonyericsson.semcsuite.data.GameContentProvider
10-14 07:02:43.335: I/com.sonyericsson.semcsuite.data.PreferenceHandler(1342): DebugMode: false
10-14 07:02:43.335: I/com.sonyericsson.semcsuite.data.PreferenceHandler(1342): LaunchMode: 0
10-14 07:02:43.335: I/com.sonyericsson.semcsuite.data.PreferenceHandler(1342): PSNMode: 0
10-14 07:02:43.415: V/Z-System(1327): Application loaded: 
10-14 07:02:43.425: D/ContentUtil(1342): Adding content: com.gameloft.android.GAND.GloftAsp6.asphalt6
10-14 07:02:43.445: W/dalvikvm(1327): dvmFindClassByName rejecting 'com/sonyericsson/zsystem/jni/ZJavaActivityInput'
10-14 07:02:43.455: W/dalvikvm(1327): dvmFindClassByName rejecting 'com/sonyericsson/zsystem/jni/ZJavaActivitySensor'
10-14 07:02:43.465: W/KeyCharacterMap(1327): No keyboard for id 0
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): No keyboard for id 65539
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): Can't open keycharmap file
10-14 07:02:43.465: W/KeyCharacterMap(1327): Error loading keycharmap file '/system/usr/keychars/msm_pmic_pwr_key.kcm.bin'. hw.keyboards.65540.devname='msm_pmic_pwr_key'
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): No keyboard for id 65541
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): Can't open keycharmap file
10-14 07:02:43.465: W/KeyCharacterMap(1327): Error loading keycharmap file '/system/usr/keychars/atdaemon.kcm.bin'. hw.keyboards.65542.devname='atdaemon'
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): Can't open keycharmap file
10-14 07:02:43.465: W/KeyCharacterMap(1327): Error loading keycharmap file '/system/usr/keychars/simple_remote.kcm.bin'. hw.keyboards.196609.devname='simple_remote'
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: I/Z-System input(1327):  O button is mapped with DPAD_CENTER! X and O are swapped!
10-14 07:02:43.495: D/ContentUtil(1342): Adding content: com.digitallegends.brucelee
10-14 07:02:43.525: D/ContentUtil(1342): Adding content: com.gameloft.android.GAND.GloftStsq.ML
10-14 07:02:43.555: I/PackageIntentReceiver(1342): Package com.sony.playstation.NCJA10031_1 Launched
10-14 07:02:43.555: I/ActivityManager(235): Start proc com.playstation.pssuite for broadcast com.playstation.pssuite/.ui.PackageIntentReceiver: pid=1351 uid=10073 gids={3003}
10-14 07:02:43.555: I/ActivityManager(235): No longer want com.google.android.apps.uploader (pid 1187): hidden #16
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.625: I/AudioHardwareMSM7X30(143): Routing audio to Speakerphone
10-14 07:02:43.625: I/AudioHardwareMSM7X30(143): Change routing audio to speaker for xLOUD
10-14 07:02:43.635: I/ActivityThread(1351): Pub com.playstation.pssuite.data.GameContentProvider: com.playstation.pssuite.data.GameContentProvider
10-14 07:02:43.645: D/AudioHardwareMSM7X30(143): value of device and enable is 32 1
10-14 07:02:43.655: D/kernel(122): [  277.195556] [msm7x30.c:msm_device_put] device xloud_speaker_stereo_rx set 1
10-14 07:02:43.655: D/kernel(122): [  277.195556] [msm7x30.c:msm_device_put] device freq =48000
10-14 07:02:43.655: D/kernel(122): [  277.198425] [adsp.c:msm_adsp_get] module AFETASK has been registered
10-14 07:02:43.655: D/kernel(122): [  277.198455] [adsp.c:msm_adsp_enable] enable 'AFETASK'state[0] id[17227119]
10-14 07:02:43.665: D/kernel(122): [  277.206481] [adsp.c:adsp_rtos_mtoa_cb] rpc event=0, proc_id=2, module=17227119, image=0
10-14 07:02:43.665: D/kernel(122): [  277.206481] [adsp.c:adsp_rtos_mtoa_cb] module AFETASK: READY
10-14 07:02:43.665: I/com.playstation.pssuite.data.PreferenceHandler(1351): DebugMode: false
10-14 07:02:43.665: I/com.playstation.pssuite.data.PreferenceHandler(1351): LaunchMode: 0
10-14 07:02:43.665: I/com.playstation.pssuite.data.PreferenceHandler(1351): PSNMode: 0
10-14 07:02:43.715: D/kernel(122): [  277.252899] msm_snddev_poweramp_on: power on amplifier
10-14 07:02:43.715: D/kernel(122): [  277.252960] [adsp.c:msm_adsp_get] module AUDPPTASK has been registered
10-14 07:02:43.715: D/kernel(122): [  277.252990] [adsp.c:msm_adsp_enable] enable 'AUDPPTASK'state[0] id[17227122]
10-14 07:02:43.715: D/kernel(122): [  277.256134] [adsp.c:adsp_rtos_mtoa_cb] rpc event=0, proc_id=2, module=17227122, image=0
10-14 07:02:43.715: D/kernel(122): [  277.256164] [adsp.c:adsp_rtos_mtoa_cb] module AUDPPTASK: READY
10-14 07:02:43.715: D/kernel(122): [  277.260314] [audpp.c:audpp_dsp_event] ENABLE
10-14 07:02:43.725: D/kernel(122): [  277.264648] [adsp.c:msm_adsp_write] AUDPPTASK command took 69 attempts: rc 0
10-14 07:02:43.935: I/PackageIntentReceiver(1351): Package com.sony.playstation.NCJA10031_1 Launched
10-14 07:02:43.985: W/dalvikvm(1327): dvmFindClassByName rejecting 'com/sonyericsson/zsystem/jni/ZJavaActivityGFX'
10-14 07:02:43.985: I/Z-System gfx(1327): eglInitialize() - Getting display
10-14 07:02:43.985: D/libEGL(1327): loaded /system/lib/egl/libGLES_android.so
10-14 07:02:43.995: D/libEGL(1327): loaded /system/lib/egl/libEGL_adreno200.so
10-14 07:02:43.995: D/libEGL(1327): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
10-14 07:02:43.995: D/libEGL(1327): loaded /system/lib/egl/libGLESv2_adreno200.so
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - disp =com.google.android.gles_jni.EGLDisplayImpl@2b000590
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Initializing EGL
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Major=1 Minor=0
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Getting config
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Choosing config
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - config[0] = 5650 D:16 AF:16 AMS:0 SS:0 MSAA:0:0 BS:16 L:0 ST:1415
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - MatchingConfigs=12
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Creating display surface. NativeWindow=android.view.SurfaceView$3@2afd4bf0
10-14 07:02:44.015: I/Z-System gfx(1327): eglInitialize() - Creating context
10-14 07:02:44.015: I/Z-System gfx(1327): eglInitialize() - Making context the current one
10-14 07:03:14.195: D/kernel(122): [  307.732604] max17040 0-0036: batt: 82%, 4048 mV

SO-01D その4

apkの解析

■ AndroidManifest.xml

バンディクとみんごるの差分では、

<manifest package="com.sony.playstation.NCJA10031_1"
<manifest package="com.sony.playstation.NCJA10093_1"

これくらい。

■ パッケージ名

んで、まぁ、パッケージは被らなければ良いので良いのですけど、命名規則とか気になる。

http://forum.xda-developers.com/showpost.php?p=16520496

上記を読むと、ロケールに依存してバンディクパッケはこんな違いがあるらしい。

usa, r800x: com.sony.playstation.ncua94900_1.apk
europe, r800i: com.sony.playstation.ncea00344_1.apk

NC{ロケール文字}A{5桁}_1

クラッシュバンディクのプロダクトID

日本版はSCPS-10031
米版はSCUS-94900
欧版はSCES-00344

http://www.gamefaqs.com/ps/196986-crash-bandicoot/data

なるほどー

NC{ロケール文字}A{プロダクトID下5桁}_1

という規則ですね。

日本版でも、SCPSやSLPSがあるので、下5桁では被るものがあるかもしれませんが、気にするレベルではないですね。

ちゅう訳で、日本版で変換する場合は、

NCJA{プロダクトID下5桁}_1

というフォーマットで良いということ。

■ assets
- AndroidManifest.xml
- {package}_1.zpak

マニフェストはルートのものと同一。
zpakは、例えば、NCJA10031_1ならば、NCJA10031_1_1.zpakとなる。

zpakの中身は、
- metadata.xml
- assets
  - *.dds
  - editmaps
  - default
    - bitmaps
      - icon.png
- data
  - params.bin
など、わらわらとありますが、metadata.xmlにはゲーム名称やレーティングなど固有情報を埋める必要あり。icon.pngは勿論固有。ddsやparams.binは差分がないので流用可能です。

■ lib
- armeabi
 - libjava-activity.so
 - libzplatform.so

これは恐らくjniアクセスするpsoneネイティブエミュレータなんだろうけど、バンディクとみんごるで差分が出てしまっている。
このエミュで、rtypesは動作していたので問題はないと思うけど、psxperiaで色々と補正をしている節があるので要注意。

■ res
- drawable
 - icon.png 
- values
 - strings.xml
当たり前の差分ちゅうことで。

以上。

SO-01D その3

構想メモ

  1. [抽出]既存のapk(バンディクかみんごる)からpsone emulator(so含む)およびbiosを引っこ抜く機能(初回)
  2. [変換]付与されたパラメタおよびiconなどのリソースからapkを作成する機能
  3. [変換]psonegame imageを圧縮してbiosと各種パラメタを付与してzpakを作成する機能
  4. [転送]zpakを転送する機能
  5. [転送]adb使ってapkをインストールする機能

TODO
  1. apkパッケージ構造解析
  2. apkパラメタ解析
  3. zpakパッケージ構造解析
  4. zpakパラメタ解析
理想
  1. リップ機能も付与
SO-01Dを接続し、タイトルとアイコンだけ設定したら、CDがちゃんこしてスタートすると、リップ->ID生成->apk/zpak生成->転送/インストールまで終える感じ。
そういや、IDがpspの時と違って、SLPSとかああいうのでは無いんだよな。いまいちルールを把握していない。和のバンディクだと"NCJA10031_1"こんなの。

SO-01D その2

いきなり道を外れてしまいますが、自炊プレイの検証。

手順

  1. プレイしたいps1 discをリップ
  2. psxperiaで変換(色々と長いので割愛)
  3. 作成されたapkとzpakをsdへ複写
  4. apkをインストール

雑感

  • ゲーム単体を一つのアプリとしてカテゴライズする方式みたい
  • apkインストールのワンクッションが怠い
  • psxperiaは海外の方が作成し、グロのSO-01Dをベースにしているため、psxperiaの改修が必要。
  • psxperiaはオープン
  • javaで開発されている。guiはswingを使用。


とりあえず、細かいことは置いておき、動作確認。



何か特別というか、ちょっとした時(売女が割れた時とか)に変換しようと温めておいたRTYPESちゃんです。素晴らしき100円プライシング。


おぉ?


拍子抜けなくらい、正常に動作しています。

という訳で、root奪取しないと、バンディクのapkを確保出来ないので一度は必要ですね。

SO-01Dはちょっと薄いので、アクションやシューティングは微妙かもな。
フィット感では、PSPの方がやはりゲーミング特化しているので良いです。

興味が湧いてきたので、apk/zpakの配置、インストールも自動化するよう作ってみよう。