forked from autch/piemu
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreadme.txt
352 lines (246 loc) · 11.2 KB
/
readme.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
-*- mode: Text; mode: auto-fill; -*-
P/EMU/SDL
=========
これは,Naoyuki Sawa さんによる P/ECE エミュレータ P/EMU を改造した版で
す.
・原作は Win32 に依存していたものを,SDL に移植しました.このため,SDL
が動作するプラットフォームであれば少ない工数で移植できるはずです.とり
あえず Windows, Linux と PSP 版の makefile を用意してあります(各種ツー
ルは未移植).CPU コアのエミュレーションにエンディアンネス依存部分が多々
ありますので,MacOS X 等への移植は当分簡単にはいかないでしょう.
・メモリイメージ方式を採用し,エミュレータの実行に実機は必要なくなりま
した.システムアップデート用のイメージファイルが公式サイトで公開されて
いますので,このイメージファイルを使えば実機不要ブートができます.現状
イメージの生成や編集の手順が面倒です.
・このプログラムはまだ開発途上です.エミュレータとして当然要求されるは
ずの多くの機能が未実装です.
このドキュメントは長いですが,読まないときっとハマります.
Windows 版
----------
800MHz ~ 1GHz 程度のクロックで動く CPU が必要ですが,とりあえず動きま
す.Windows XP SP2 でしか検証していません.相変わらず遅いですが,原作
のように CPU 利用率 100% にはならないはずです.
SDL.dll は別途用意してください.
Linux 版
--------
気が向いたときに VMware でコンパイルして検証している程度ですが,とりあ
えず動きます.ツール類はまだ移植していません.リビジョンによってはこけ
るかもしれませんが適当にほげってくださいということで(ぉ
Vine Linux 3.2 でコンパイルと動作検証をしています.Turbolinux だと SDL
も自力ビルドする必要があるかもしれません.
添付の makefile.linux で作られる実行ファイルは piemu.linux です.
PSP 版
------
なんというかネタビルドです(ぉ 現状まともな速度では動作しません.
とりあえず HOME キーでエレガントに終了することはできますが,その程度で
す(ぉ
添付の makefile.psp を使ってコンパイルすると,Firmware 1.5 用の実行ファ
イルは piemu と piemu% ディレクトリにできます.Firmware 1.0 用の実行ファ
イルは EBOOT.PBP です.
実機を持っているとき
--------------------
実機をお持ちであれば,フラッシュメモリイメージを実機から吸い出して作成
することができます.P/ECE 実機を USB に接続して,コマンドラインから
tools/ ディレクトリにある FlashRipper.exe を実行すると,カレントディレ
クトリに piece.pfi というファイルができます.これがフラッシュメモリイメー
ジですから,piemu.exe と同じディレクトリに置いてください.置かないとエ
ラーすら出さずにクラッシュします.一度 piece.pfi を生成したら後は実機は
不要です.
SDL のランタイムを入手し,piemu.exe と同じディレクトリか PATH の通って
いるところにおいてください.そして piemu.exe を実行すると,通常なら
startup.pex が起動するはずです.
実機を持っていないとき
----------------------
P/ECE 公式サイトではシステムアップデートのためにカーネルのイメージファ
イルを配布しています.このイメージファイルに細工することで,P/EMU/SDL
の実行に必要な piece.pfi 形式イメージファイルを実機から吸い出すことなく
生成することができます.
まずは公式サイトから最新のシステムアップデートを入手し,中の
update/all.bin を用意します.all.img では *ありません*.フラッシュ 2MB
対応版や MMC/SD 対応版でもかまいません(が,MMC/SD のエミュレーションは
実装していません).これをどっかのディレクトリに放り込んでおいて,
P/EMU/SDL のアーカイブの tools/ ディレクトリにある mkpfi.exe を以下のコ
マンドラインで実行します.
mkpfi.exe [-512kb|-2mb] all.bin [piece.pfi]
用意した all.bin が対応するフラッシュ容量に応じて -512kb か -2mb のどち
らかのオプションをつけてください.デフォルトは -512kb です.piece.pfi
へのパスは任意です.省略すると all.bin と同じディレクトリに生成されます.
こうしてできあがった piece.pfi ファイルがフラッシュメモリイメージですか
ら,piemu.exe と同じディレクトリに置いてください.置かないとエラーすら
出さずにクラッシュします.一度 piece.pfi を生成したら後は all.bin 等は
不要です.
SDL のランタイムを入手し,piemu.exe と同じディレクトリか PATH の通って
いるところにおいてください.そして piemu.exe を実行すると,通常なら
startup.pex が起動するはずです.
ファイルシステムイメージの編集
------------------------------
P/EMU/SDL のフラッシュイメージファイルには,P/ECE カーネルと P/ECE フラッ
シュファイルシステム(PFFS)が保存されています.PFFS にファイルを追加し
たり削除したりするには,(いまのところ)tools/ ディレクトリの pffs.exe
を使います.このツールの使い方は次の通りです.
pffs.exe piece.pfi -{adelv} [file [...]]
-a file を追加 or 上書きする。
-d file を削除する
-e file を取り出す
-l ファイル一覧と空き容量をみる
-v イメージのシステム情報をみる
……これらのツールの GUI 版も必要でしょう.
操作
----
原作にあったジョイスティック対応は今のところ削除されています(ぉ
Windows/Linux 版
Z A
X B
A START
S SELECT
カーソルキー 方向キー
PSP 版
○ A
× B
START START
SELECT SELECT
HOME 終了
方向キー 方向キー
TODO
----
- エミュレータ実行中にフラッシュメモリをイメージファイルに書き戻す
手段が必要.今のままでは動作中に書き換えられたフラッシュメモリの内容が
残らない.
- 各種ツールの GUI 化.
- もっと高速化.
- USB エミュレーション.Windows サイドには偽 pieceif.dll を用意するこ
とで対処する.
- MMC/SD エミュレーション.もともとはシリアル拡張端子だけど.
- CPU エミュレーション部分のクリーンアップ.
- フラッシュメモリイメージ形式をさっさと確定させる.
- きっとまだたくさんある.
ハックするには
--------------
あらかじめ SDL-devel を入手し、VC++ ならそのパスを環境変数 LIB や
INCLUDE に書いておきます。Linux 版や PSP 版なら SDL のパスは(ちゃんと
インストールされていれば)自動検出されます。
GNU make が必要です。オプションで bash や rm があれば makefile の各コマ
ンドを直接使えます。
VC++ 版
-------
VC++.NET 2003 でコンパイルしています。そのまま make でコンパイルできま
す。
Linux 版
--------
Vine Linux 3.2 でコンパイルと動作確認しています。make -f
makefile.linux でコンパイルします。piemu.linux が実行ファイルです。
PSP 版
------
/bin/mkdir "piemu"; /bin/mkdir "piemu%"
make -f makefile.psp all
プロジェクトディレクトリにできる EBOOT.PBP が Firmware 1.0 用の実行ファ
イルです。1.5 用のファイルは make -f makefile.psp kxploit とすれば
piemu と piemu% というディレクトリにそれぞれ入ります。
開発
----
開発は ヅラChu さんの Subversion リポジトリにて行われています.
最新バージョンのソースコードは,svn://tamaki.zurachu.net/piemu/trunk か
ら匿名でもチェックアウトできます.ビルドには Visual C++.NET 2003 か
Cygwin gcc が必要です.基本的に開発は内輪で行われています.
-----
Yui N. (aka Autch)
http://www.autch.net/
---------------------------------------------------------------------
以下は実装途中のメモです.
つかいかた
実機から吸い出して使う:
実機を USB につないで tools/FlashRipper.exe を実行
できた piece.pfi を piemu.exe と同じ dir において実行
all.bin を使う:
all.bin を tools/mkpfi.exe と同じ dir に置く
tools/mkpfi.exe all.bin として実行、or mkpfi.exe に all.bin を DnD
できた piece.pfi を piemu.exe と同じ dir において実行
一度 piece.pfi を作ったら実機は不要。all.bin も不要。piemu.exe と
piece.pfi (と SDL)だけ持ち歩けばよい。
ファイルエリアの編集:
吸い出した or ねつ造したイメージのファイルエリアを編集するには、
pffs.exe piece.pfi -adelv [file [...]]
-a file を追加 or 上書きする。
-d file を削除する
-e file を取り出す
-l ファイル一覧と空き容量をみる
-v イメージのシステム情報をみる
これから -i(初期化)も必要になると思う。
ほかに要りそうなツール
dlpfi pfi を実機へ書き込む(!)
editpfi pfi の SYSTEMINFO を書き換える
大事
現在の PFFS では FAT エントリが全部で 496 個までしか使えないので、最大
サイズは 4,096 * 496 = 2,031,616 bytes まで。同様にファイルの個数は全部
で 96 個まで。
なぜ使い分ける
p/ece(というか S1C33000)はブート時にフラッシュメモリ先頭に書かれてい
るアドレス(リセットベクタ)へジャンプするようになっている。フラッシュ
メモリの先頭(アドレス $c00000, s1c33 のアドレス空間は 28bit)から 2 セ
クタ、8192 バイト分は緊急用カーネルが入っている。p/ece はブート時にアド
レス $c00000 の内容を読む。ここには $c00004 と書かれているので、(すぐ
隣の)そこへジャンプする。
$c00004 にはさらに緊急カーネルへのエントリポイントへの相対ジャンプ命令
が書かれているので、(カーネルシグナチャや GUID 領域を飛び越えた)そこ
へジャンプする。そこで割り込みの禁止、SP や PSR の初期化をしてから、
$c02000 から $1000 単位で通常カーネルのシグナチャを探す。
シグナチャは +8 のオフセットのところにあるので、$c02008, $c03008,
$c04008, ... とメモリを見ていき、そこにカーネルシグナチャがあればオフセッ
ト +0, つまり $c02000, $c03000, $c04000, ... の内容を読み出し、そこが示
す先(普通オフセット +4)へジャンプする。
$c02004 にはさらに通常カーネルエントリポイントへの相対ジャンプ命令が書
かれているので、通常カーネルをブートすることができる。
p/ece カーネルアップデートに使う all.bin 形式のイメージファイルは、先頭
2 セクタ分の緊急カーネルが省かれており、USB 経由で ku.srf を使って
$c02000 以降のセクタを書き込むようになっている。カーネルアップデート時
に緊急カーネルまで上書きしてしまっては、書き込みが失敗したときに緊急カー
ネルの意味を成さなくなるためである。
FlashRipper で実機から吸い出すイメージファイルには、緊急カーネルの先頭
2 セクタ分が含まれているので、これをエミュレータのアドレス $c00000 へ読
み込んでやれば問題なくブートすることができる。
all.bin のイメージには先頭 2 セクタ分のイメージが欠けているので、このま
ま $c00000 へロードしてもブートすることはできない。そこで、all.bin から
ブートイメージを作るときに、先頭 2 セクタ分を捏造することで対応すること
にした。ブート時に最初にアクセスされる $c00000 に$c02004 を書き込んでし
まうのだ。こうすれば s1c33 はいきなり通常カーネルがあるはずのエントリポ
イントを見に行くことになる。SP や PSR の初期化等は通常カーネルでも行わ
れるので問題ない。
PFI ファイルフォーマット(P/EMU Flash Image file format)
p/emu/sdl が利用している pfi 形式イメージファイルには、p/ece のシステム
情報(piece.h の SYSTEMINFO 構造体)も保存されている。この情報はハード
ウェアのエミュレーションに必須のため、フラッシュメモリイメージと一緒に
含めてしまうことにした。この情報は本来カーネルメモリイメージから取って
こられるのだが、非実機環境で簡単に取得する方法がないので、FlashRipper
で実機から吸い出す際に一緒に取得することにし、all.bin で実機不要ブート
するときには標準的なパラメータを mkpfi が生成するようにした。
pfi ファイル形式の簡単な説明を示す。すべてリトルエンディアンである。
DWORD dwSignature
ファイル識別子 'PFI1'. リトルエンディアンなのでバイトの並びは "1IFP" と
なる。
DWORD dwOffsetToFlash
フラッシュメモリイメージの開始オフセット。
SYSTEMINFO siSysInfo
P/ECE システム情報構造体。内容は「p/ece API リファレンス」を参照。
(そしてフラッシュメモリイメージが続く)
PFI フォーマットの将来のバージョンで siSysInfo 以降からフラッシュメモリ
イメージまでの間にデータが増えるかもしれない。その増えたデータがエミュ
レータの実行に必須のときは、ファイル識別子の末尾の数字を PFI2, PFI3,
PFI4, ... のように増やす。
TODO
32bit color 化 for PSP
SYSTEMINFO のねつ造(overclocking, etc.)
virtual USB
virtual MMC -- ディスクイメージ方式?
PFFS editor
how to save the modification to PFFS
// SDLize // done
making it more faster
endianness problem
porting for PSP
TBD
PFFS と kernel 分離する?
system.pfi PFI0 SYSTEMINFO とカーネル
piece.pfi PFI1 ↑と↓両方
pffs.pfi PFI2 PFFS 部分だけ
ライセンス
nsawa さんが何と言うか……。