PS2Linuxでプレイステーション2プログラミングをしよう(前編)

 PS2 Linux Kitは家庭用ゲーム機「プレイステーション2」上で、動作するLinuxですが、通常のLinuxディストリビューション同様、ライブラリやコンパイラなど開発環境が用意され、プレイステーション2ならではのプログラミングの世界が待っています。その第一歩のために、ケータイWatchでおなじみの大和 哲氏によるプログラミング入門を前後編で掲載します。(編集部)


■まずはPS2 Linuxのパッケージをざっと見てみる

 PS2Linuxは家庭用ゲーム機であるプレイステーション2でLinuxを動かすためのキットだ。Linuxはご存知のようにUNIXライクなオープンソースのOSで、たとえば、RedHat LinuxやVine Linux、Kondara MNU/Linux、Debian GNU/Linuxなどのように「ディストリビューションパッケージ」として配布されているものにはカーネルそのものだけでなく、各種ツールや開発環境、ウィンドウシステムもソース入りで配布されていることも多い。当然、OSそのものを含む仕様がほぼ公開されているわけで、ユーザーが趣味でプログラミングすることももちろん可能だ

 PS2 Linux Kit(以下PS2Linux)も、ライブラリ仕様から、コンパイラ、開発環境などが一式揃っていて、ユーザープログラミングが可能になっている。

 そんなわけで、プレイステーション2とPS2Linuxのハード・ソフトの仕様を知って、PS2のハードウェアを自作プログラムから使ってみよう、というのがこの記事の趣旨だ。 まずはPS2Linuxのパッケージをざっと見てみよう。このキットはRedHat系ディストリビューション(一説にはKondaraベースと言われている)のLinuxをベースにしていて、主なソフトウェアには

・Linux カーネル 2.2.1 + 2.2.18の一部
・XFree86 3.3.6
・gcc 2.95.2 (glibcのバージョンは2.2.2)

というようなものが含まれている。

 また、プレイステーション2でプログラミングするとなれば、プレイステーション2の機能を使いたいと思うのも人情だろう。そういう意味ではこのキットはかなり親切で、

・プレイステーション2専用低レベルグラフィックスライブラリ
・Mesa GraphicsSynthesizer に対応したコンソール用ドライバ
・プレイステーション2のハードウェアを解説したPDFファイル

なども含まれており、プレイステーション2らしいプログラミングももちろん可能だ。

 ただし、正直に言って、PS2Linuxでそれなりのレベルのゲームを作るということは非常に難易度が高く、奥の深いものであることをここでお断りしておく。

 というのも、プレイステーション2のハードウェアは高性能を出すために複雑な構造になっているからだ。たとえば、行列演算などは高速化するためにハードウェアで行なうが、メインのプログラムを実行するプロセッサとこの演算プロセッサは並列して動くために、プロセッサ間でデータ通信を行なったりと多少複雑なギミックを用いることになる(ハードウェアの問題なので、Linuxではなく業務用のゲームのプログラミングでも同様らしいのだが)。そのため、デバッグもやっかいな状況になることがある。

 また、プレイステーション2の特徴といえば、なんといっても美麗なグラフィックだが、3Dグラフィックプログラミングをしようとすると3次元の考え方、ベクトル・内積や行列演算などというようなプログラミングとはまた別の分野の知識なども必要になってくる。

 さらにいえば、PS2Linuxを使いこなそうと思うと、ツールを利用するうえでLinuxの知識も欠かせない、という問題もある。Linuxが特にほかのOSと比べて難しい、というわけではないのだが(特に最近のWindowsやMac OSでも複雑な部分は多い)、普通にPCで使われているWindows系のOSやMac OSとはかなり勝手が違うので、おそらく環境整備やサンプルの解凍やコンパイルだけでもLinux/UNIX独特のトピックを憶えなくてはならないことになる。

 今回は、このあたりの解説はしないので、世にあるLinux本の類を読んで鍛えていただきたい。

 なお、Linuxでのプログラミング自体が初めてということであれば、ソフトバンクから発行されている「Linux プログラミング(ISBN4-7973-0819-2)」あたりを一冊手に入れて目を通しておくことをお勧めする。gccの基本からLinuxでのプログラミングでのノウハウまでが網羅されているので、プログラミングがずいぶん楽になるだろう。

 また、「PS2Linux」のセット内容自体に関しては
【6月20日】「PS2 Linux Kit」ハードウェアレポート
http://pc.watch.impress.co.jp/docs/article/20010620/ps2.htm

 とりあえず使うところまでは

【6月22日】塩田紳二のPS2 Linuxレポート
~とりあえず動かしました編~
http://pc.watch.impress.co.jp/docs/article/20010622/PS2Linux.htm
【7月25日】塩田紳二のPS2Linuxレポート
~環境整備、デモプログラムのテスト編~
http://pc.watch.impress.co.jp/docs/article/20010725/PS2Linux.htm

をご参照いただくといいだろう。


■PS2のハードウェアの知識

 いきなりだが、まずは、プレイステーション2でプログラミングをする大前提として、このハードウェアがどのような構成になっているのを知っておこう。かなり大雑把だが、プレイステーション2のハードウェアは、概念的にはだいたい以下のような感じになっている。

プレイステーション2のハードウェアブロック概念図

それぞれのLSIは以下のような役割を果たしている。

・GraphicsSynthesizer

 GraphicsSynthesizerは画像処理LSI。4MBのメモリと高速なバスで接続されたレンダリングエンジンが内蔵されていて、描画を担当している。レンダリング能力はフラットポリゴンで7,500万ポリゴン/secを描画することができる、とされている。

・EmotionEngine

  メインCPU部分は「EmotionEngine」というLSIだが、これは、機能的には次のように分かれていると考えていい。

ひとつはCORE部分。MIPS R5900相当CPUコアでプログラムの解釈や整数演算を行なう。これと浮動小数積和・除算演算器を持ったFPUとで、現在流通しているごく普通のCPU相当の機能を担当していると思えばいいだろう。

 残りの2つは、VU0とVU1と呼ばれるユニットだ。これらはそれぞれベクトル演算を担当するユニットだ。VU0が物理演算、VU1がポリゴン描画を行なうための演算を担当している。VU0とVU1による浮動小数点演算性能は6.8GFLOPSといわれている。

 画面描画はGraphicsSynthesizerに対して「どの座標にあるどのような物体を描くのかなどを指示したデータ」を送ることで描画を行なうわけだが、VU1に、このデータの生成を行なわせることができるわけだ。

・メモリ

 プレイステーション2には32MBのRDRAMが搭載されていて、EmotionEngineとは128bitバスで接続されている。EmotionEngineのCOREがこのメモリをアクセスできるのは当然だが、それ以外にもDMA(ダイレクトメモリアクセス)を利用することで、VU0、VU1、IPU、それにGIFを経由してGSがメモリとのデータの受け渡しをできるようになっている。

 なお、プレイステーション2ではDVD-ROMを搭載していることも特徴だが、通常のCD-ROMはマウントできず、これを使ったソフトウェアの配布はできないのが現状なので、作ったソフトはネットワーク経由で配布する、というのが順当だろう。


■PS2とPS2Linuxのソフトウェア構成

 さて、プレイステーション2に載っているPS2Linuxでは、ソフトウェアはこれらのハードウェアを以下のように取りまとめている。

 “プレイステーション2”Runtime Environmentの解説によれば、PS2LinuxではRuntime Environmentが「I/Oサブシステムを制御するバイナリコードとサブシステムへのインターフェースを提供します。 I/Oサブシステムへのインターフェース部は、“PS2Linux”カーネル起動後もメモリに常駐し、 周辺ハードウェアに対する基本的な入出力機能を“PS2 Linux”カーネルに提供」している。

 つまり、ソフトウェアからは、周辺機器は、基本的にはデバイスドライバなどを通して、たとえば、コントローラなどであればLinux標準のデバイス(ジョイスティック)としてデータを読むことができるようになっている。

 また、プレイステーション2には(PS2LinuxのKernelオプションを見る限りでは)SBIOSというBIOSがある(dmesgのメッセージによれば、SIF BIOS)。このBIOSがハードディスクやUSB、コントローラなどの管理もしているようだ。

 グラフィック関係のドライバはこの中には含まれていない。グラフィックスの使い方としてはX Windowシステムによるものを除くと

・GS用デバイスドライバの呼び出し
・専用低レベルグラフィックスライブラリ
・Mesa GraphicsSynthesizer に対応したコンソール用ドライバ

が利用できる。なお、PS2Linuxは通常のLinux+ X Windowシステムの構成なので、Linux/各種UNIX上で使われている普通のX11アプリケーションであればコンパイルすればそのまま、X用のプログラムも動く。その場合、PlayStatison2の持っているハードウェアアクセラレーション機能などは使われない。

 MESAはコンソールへ直接画像を出力するOpenGLなどに互換のライブラリだ。こちらは塩田氏により後日レポートされるということなので、概要についてはそちらを参照されたい。

 また、Mesa自体については、The Mesa 3D Graphics Library( http://www.mesa3d.org/ )を参照してみるといいだろう。


■ドキュメントを見る

 PS2Linuxでは、DVD-ROMの中にハードウェアに関する日本語と英語のドキュメントがPDF形式で収録されている。プレイステーション2上で読むこともできるが、PC上などにコピーして読むほうが楽だろう。日本語の資料と英語の資料は、基本的に内容は同じようだ(若干、日本語の資料のほうが新しいものなようだが)。

 これらの資料には基本的にはハードウェアの仕様などが書かれていて、もちろん読むべきなのだが、容量にして約6MBとかなり膨大なページ数で、どれから手をつければいいのか迷ってしまうところだろう。

 プレイステーション2でのホビープログラミングを楽しみたいということだけであれば、筆者のとしては、まずは、サンプルプログラムを眺めて、その中の気になった関数をライブラリのディレクトリにある「xxxxx_jp.txt」というようなそれぞれのライブラリの資料を読み、それから、このPDFファイルの該当する部分を、関数のある背景を知るために見てみる、というつまみぐい的な読み方をすることをお勧めする。

 もちろん、プレイステーション2のハードウェアを極めたいということであれば、全てを読んで把握することはいいことだと思う。

 このPS2Linuxに含まれているPDFファイルの内容は大雑把に見ていくと、以下のようになっている。

・register.pdf 「EE補足資料レジスタマップ 」
・restrict.pdf「ハードウェアに関する注意事項 」

 この2つには/coreinst、/eecoreなどの資料を利用してプログラムを組むときに必要となる補足資料などが書かれている。

/coreinst/Inst_0.pdf 「EE Core Instruction Set Manual」

 「ADD、Bxx(BEQ,BNE,BLT,BGT…)、SUB…」などといった、プレイステーション2のCPUであるEmotion EngineコアのCPU命令セットなどの解説が載っている。

 アセンブラレベルでEmotion Engineを利用するのであれば必要な資料だ。

/eeover/Eeover_j.pdf 「EE OverView」

 プレイステーション2のCPUとベクトル演算ユニットを搭載しているEmotion Engineについての、概要が解説されたファイルだ。Emotion Engineを知る際に、まず読むべきファイルはこれだ。EEの構成図、CPUコア、ベクトル演算ユニット、ほかの装置(GSなど)へのインターフェイスの概念、なぜそれが必要なのかが書かれている。 DMA、GIFといったプレイステーション2を使う上で肝となる概念もここに説明されている。

サンプルプログラムのわからない部分を調べる程度であれば、PDFファイルではなく、ライブラリ(libps2dev)のディレクトリにあるテキストファイルをgrepすればなんとかなってしまうことも多い。これらのテキストファイルもわかりやすく丁寧に書かれているのだ。ただ、このテキスト、なぜか文字コードがJISであるので、Windowsマシンに持ってきて利用する、などという場合は注意 PDFマニュアルの中で最初に読むべきなのは「EE OverView」だろう。EEcoreやVPUのアーキテクチャ、DMA動作の概要などがわかりやすく書かれており、基礎知識が身につくだろう

/ee/EEUSER_J.PDF 「EE User's Manual」

 プレイステーション2のCPUとベクトル演算ユニットを搭載しているEmotion Engineについての、総合解説で、概念を理解するだけでなく、実際にプログラムで使う際に必要な事柄が書かれている。重要な情報だが、「EE OverView」を読んでからのほうが理解が早いだろう。

 また、TIMER割り込みやDMAの転送モードの違いなどを知るのもここ、ということになる。

/eecore/coreum_j.pdf 「EE Core Users Manual」

 プレイステーション2のCPU部分であるEmotionEngine Coreについての概要などが書かれた資料だ。CPU Coreがどのような構成になっているのか(たとえばメモリ管理はどのようにMMUが行なっているのか)などを知りたいときにはこれを参照することになる。

/gs/Gsuser.pdf 「GS User's Manual」

 GraphicsSynthesizerの解説はこの1つのPDFファイルに納められている。前半が概念や機能の紹介、後半は具体的なレジスタの紹介などが書かれている。

/vu/VU_0.PDF 「VU User's Manual」

 ベクトル演算ユニットである、VU0、VU1のマニュアルだ。VU0、VU1の解説はこの1つのPDFファイルに納められている。

 もし、ゲームプログラムのようなプレイステーション2らしいプログラムを作りたい、ということであれば、始めの1歩としては「EE OverView」、「GS User's Manual」の前半、「EE User's Manual」、「VU User's Manual」の順に眺めていけば理解の助けになるだろう。

 また、開発ツール群(gcc、gas、ee-as)の説明はPS2Linuの/usr/doc/PlayStation2の中にある。toolchain_*.txtにはgcc を使う上での注意点なども書いてあるので、一読しておくことをおすすめする。

【追記】
 前編でのPS2のハードウェア構成について、読者の方からご指摘とご教示をいただきました。訂正させていただくとともに、ご指摘に感謝いたします。

(2001年8月23日)

[Reported by 大和 哲]


【PC Watchホームページ】


ウォッチ編集部内PC Watch担当 pc-watch-info@impress.co.jp

Copyright (c) 2001 impress corporation All rights reserved.