PSやろーぜ'99[第4回]
■ 起動まで辿り着いたが...
GTEの一部を実装し、ようやくPSロゴが表示されるところまで行くことが出来まし
た。表示は、自作のGPUドライバとKazSoftドライバで試してみましたが表示はだい
たいうまくできてました。ここまでに、内部構造の大幅な改造(マルチスレッド化)
を行いました。今までは、数命令実行するたびにメッセージを取りにいっていまし
たが、一度に実行する命令数を増やすとメッセージが迅速に処理できずWindowsア
プリケーションとしての動作がおかしくなってしまうし、逆に減らすとエミュレー
ション速度がかなり落ちてしまうのです。だから、メッセージ処理用のスレッド、
仮想プロセッサ用スレッドとを分けることにより効率化を図りました。当然のこと
ながら、メッセージスレッドはメッセージの無い時はスリープさせ、仮想プロセッ
サ用スレッドはアプリケーション停止中はスリープしなければなりません。こうし
ないと常時2倍の負荷がCPUにかかってしまうでしょう。
今まではほとんどがBIOS内部での実行だけでしたが(つまり今まではCDいらずだっ
た)、SCEロゴが出たあとに、PSロゴが出ると設定ファイルを解析して実行ファイル
を読み込んで実行するところまで行きます。ところが、CD内の実行コードを実行す
るところまでいくとほとんどのソフトで無限ループが発生してしまうんです。ログ
を眺めてみても、特定のI/Oをアクセスしているわけでもないし(だいたいがイベン
ト待ち)、まったく???な状態です。これは、第二の難関です。たぶん、これを
クリアすればゲームの動作まで近いと思うのですが、もう少し根性が必要なのかも
しれません。
動作テストは、3種類のディスクで行っています。まず最初に、PS初期の「ポポロ
クロイス物語」。キー入力を受け付けそうな状態になりますが、無限ループに陥り
ます。次に、PS中期の「FF7」。最後に、PS後期(プロテクトあり)の「パラサイト
イヴ2」です。どちらも、イベント待ちらしいコードを実行しながら無限ループに
入ります。課題は、この無限ループから脱出するにはどんな手を使ったらよいかを
考える必要があります。
- 2000年2月27日 -