x64コードジェネレータの部分を開発した。


x64コードジェネレータとは、64bit版 x86命令を生成するプログラムのことである。

pcsx2のソースディレクトリ(\x86\ix86ディレクトリ配下)に相当する部分といえば分かりやすいかもしれない。


x64コードジェネレータのプログラムソースが見たいという人は、以下のURLからダウンロードできる。

http://www.ssspsx.com/x64asm.h


このコードジェネレータには、以下の特徴がある。


1)すべてマクロで作られている

 関数呼び出しより、マクロのほうが、静的コンパイル時に最適化されやすい。


2)マクロ名の銘銘規則

 マクロ名の銘銘規則は、BNF(Backus Naur Form)で定義している。


3)生成される命令長が短い

  x86命令の中には、同じ意味の命令が異なるバイト数の命令になることがある。

  たとえば、"adc eax,1"命令の場合だと次の3種類になる。
  ・3バイト
   83 d0 01
  ・5バイト
   15 01 00 00 00
  ・6バイト
   81 d0 01 00 00 00

  このコードジェネレータは、常にもっとも短い命令をジェネレートする。


  IntelのCore2 DuoやAMDのAthlon64X2では、1サイクルの間に16バイトをデコードすることができる。
  命令長が3バイトの場合は、1サイクルの間に5.3命令がデコードできる。
  一方、
  命令長が6バイトの場合は、1サイクルの間に3.2命令しかデコードできない。

  デコードにかかる時間だけに着目すると、1.6倍の差がある。


おそらく、x64asm.hは、まだ誤りがあるともうけれど、次はiR5900.cに相当する部分のコーディングに取り掛かろうと思う。


PCSX2 0.9.1をx64向けにコンパイルし、非常に遅いですが動き始めました。


用意したプラグインは、以下のとおり、

- GSdx9

- spu2PeposSound

- CDVDiso

- PasSSSPSX

- DEV9null

- USBnull

- FWnull

すべてx64向けにコンパイルしなおしています。


また、問題も残っています。

1) VisualStudio 2005では__asmが使えないため、__asmが多用してあった部分(vif.c)については、

最適化されていない方のプログラム(Non-SSE)が無条件で動作するようにしている。

2) VisualStudio 2005では、setjmp/longjmp関数に非互換があるため、setjmp/longjmpを使って

 いる部分(IPU関連)で落ちてしまう。

3) インタプリタでしか動作しない。


1)については、気が向いたときにでも、ゆっくり移植する予定です。

2)については、PCSX2 0.9.2で大きく変わりそうなので、0.9.2が公開されてから作業に取り掛かります。

3)リコンパイラは今作業しているところです。




やっと、コンパイル&リンクして、PCSX2 0.9.1 x64 editionの実行ファイルができたところです。


まだ、x64用のプラグインがないので、動作確認できていないです。

リコンパイラも作ってないので、インタプリタでヌルヌル動けばいいという感じです。


これから、x64用のプラグインを用意していきます。そして、動作確認をします。


- GS

 ZeroGSのソースコードは公開されていないみたいなので、GSsoftかGSstarisをx64向けにコンパイルしてみようと思います。

- SPU

とりあえず、SPU2 nullをx64向けにコンパイルしてみようと思います。

- PAD

SSSPSX PAD 1.7を公開しました。x64対応です。

- CDROM

CDVDisoをx64向けにコンパイルしてみようと思います。

- DEV9

DEV9 nullをx64向けにコンパイルしてみようと思います。

- USB

USB nullをx64向けにコンパイルしてみようと思います。

- FW

FW nullをx64向けにコンパイルしてみようと思います。


SSSPSX PAD 1.7をリリースしました。

http://www.ssspsx.com/SSSPSXPAD17.ZIP


変更点は、
- 最新のDirecInput9でコンパイルした。
- PADreadPort1/PADreadPort2関数が_stdcallになっていない問題を修正した。
- PAD2に何か設定したとき、PAD1に誤って入力される場合がある問題を修正した。
- x64用のDLLを追加した。
です。


これでx64版のpcsx2でもSSSPSXPADが使えると思います。

0.0.34です。修正方法も明確で簡単だったのでリリースします。

変更点は、
- 0.0.33で暫定対処したCDDAの問題を修正した。
- CDROMアクセスにおいて、正しい再生位置を示さない場合があるバグを修正した。
- リコンパイラにおいて、自己書き換えの検出に誤る場合があるバグを修正した。
以上です。

Takashi Yanoさん。調査ありがとうございます。


ちなみに以下のURLより、最新版から過去版までをダウンロードできます。

過去版についてはサーバーの容量が足りなくなったら順次消していきますのでダウンロードできない場合があります。

http://www.ssspsx.com/SSSPSX-0.0.34e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.34.ZIP

http://www.ssspsx.com/SSSPSX-0.0.33e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.33.ZIP

http://www.ssspsx.com/SSSPSX-0.0.32e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.32.ZIP

http://www.ssspsx.com/SSSPSX-0.0.31e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.31.ZIP

http://www.ssspsx.com/SSSPSX-0.0.30e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.30.ZIP

http://www.ssspsx.com/SSSPSX-0.0.29e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.29.ZIP

http://www.ssspsx.com/SSSPSX-0.0.28e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.28.ZIP

http://www.ssspsx.com/SSSPSX-0.0.27e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.27.ZIP

http://www.ssspsx.com/SSSPSX-0.0.26e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.26.ZIP

http://www.ssspsx.com/SSSPSX-0.0.25e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.25.ZIP

http://www.ssspsx.com/SSSPSX-0.0.24e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.24.ZIP

http://www.ssspsx.com/SSSPSX-0.0.23e.ZIP

http://www.ssspsx.com/SSSPSX-0.0.23.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.22.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.21.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.20.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.19.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.18.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.17.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.16.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.15.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.14.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.13.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.12.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.11.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.10.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.9.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.8.ZIP

http://www.asahi-net.or.jp/~bz7t-skmt/SSSPSX-0.0.7.ZIP


PCSX2 0.8の頃のソースコードは、共通部分とOS依存・CPU依存の部分がキチンと分離されており、Linux版やx64版のpcsx2も比較的簡単に作ることができたのですが、0.9.1になってからWin32専用といった感じになっていました。

これは、Win32以外の他の環境に移植することが難しくなることを意味しています。

Win32専用にしてしまったのは、おそらく、性能、実行速度を最優先にするあまり仕方なく・・・。といった感じに見えます。

Memory.c、PsxMem.c、Hw.c、PsxHw,c、Vif.cがすごいことになっていました。


そこで、いきなりリコンパイラ部分の開発に入るのではなく、以下の順番で開発を進めています。


1) 共通部分と、OS依存・CPU依存部分の分離を図る。

  2つのソースファイルに分けるという意味ではなく(※本当はそうしたいのですが)、#if / #endifで囲う方法にします。

  diffツールなどで、pcsx2オフィシャルのものと、差分をとることを考慮した結果です。


2) まずはx64環境でインタプリタ版を動作させる。リコンパイラはなし。

  動きだしたら、欲しい人がいたらソースコードは公開しようと思います。非常に遅く動作すると思います。


3) リコンパイラを作る。

  やっとやりたいことができます。

  32ビット版の2倍の速度が目標です。実際には、1.2~1.4倍程度になりそうですが・・・。


ところで、先日、TLB版の方が筋がよさそうと言っていたのですが、よくよく考えてみると、VM版の方が筋がよいと意見を変えます。

勘違いしてしまったことは、TLBで管理するページのサイズを、もっと大きく(※4096から16777216)すれば、テーブルサイズが小さくなり、メモリアクセスがキャッシュにヒットしやすくなるのではと思ったことです。

実際にはページサイズを変更することはできませんでした。

Windows XP Professional x64 Editionのインストールをインストールして、他によく使うアプリケーションをインストールした。


Visual Studio 2005 professional

Visual Studio 2005 MSDNライブラリ

Microsoft DirectX SDK (August 2006)

TortoiseSVN

WinCVS

秀丸

lhaz

ffftp

Becky

LimeChat


あまりコテコテと色々なソフトをインストールしないのは、私の理念というか、そんな感じです。


そして、早速、PCSX2 0.9.1をx64でコンパイル。

1) windows/VCprojects/pcsx2_2005.vcprojファイルを、秀丸でて32ビットも64ビットもコンパイルできるように編集。

2) Visual Studio 2005を起動してビルドボタンをポチ。エラー続発。


いろいろなところでエラーになっていました。変更が必要な箇所は、

1) ポインタ型を、int型/long型/u32型などにキャストしていた箇所。

2) __asm文を使っていた箇所(※信じられないことですが、x64では___asmは使えないのです)

3) idct_mmx.objや、gnu_gettext.lib、pthreadVC2.libなどをx64に移植

4) calling conventionの修正(http://en.wikipedia.org/wiki/Calling_convention

5) x64版の各プラグインの用意

6) もちろんリコンパイラの部分は全面的に・・・。


とにかく苦労しそうです。


ひととおり環境を整えて、先が長いことがわかったところで、息抜きというか休憩もかねて、LimeChatで#pcsx2チャネルにはいってみた。

EFNET(http://www.efnet.org/ )の適当なサーバーにログインして、#pcsx2チャネルを指定すればいい。

英語は得意でないので、そこで流れているメッセージは、雰囲気しかわからない。

ログインしっぱなしにしておいて、開発に疲れたら、ときどき、頭を休めるつもりで眺めてみようと思う。


bositmanさんと、saqibさんも、このチャネルに来ているようだ。

bositmanさんとはプライベートチャネルで少し話をしたけれど、ちゃんと伝わっていたかは、ナゾのままだ。

saqibさんからはプライベートチャネルで話かけられたようだけど、開発に熱中していて見逃した。




久しぶりにメールソフトを立ち上げてみると、私宛に知らない人からメールが届いていました。


Hi nagisa,

I've something to ask you. I already wrote down my thoughts:
http://forums.ngemu.com/everything-else-psx/76672-lack-active-open-source-psx-emulator-project.html

So I'm asking if you have any intentions on porting the
emulator to the unix platform (or even open-source it). I
saw you're part of the pcsx2 project here on sourceforge, so
maybe you've have already thought about that.

Best regards,
Tobias Jakobi


私は、自分でも認める職人気質のプログラマなので、ソースを公開するには完成度が高くならないと気がすまないのです。

なんとか丁寧にお断りしたいのですが、どうやって返事しましょうかね。英語だと、そのあたりの微妙な雰囲気が表現できないので返事に困っています。とりあえず、ときどき、このスレッドの行方を見ておこうと思います。


SSSPSXはリコンパイラの完成度は高いと思っているんですが、まだ、その他のハードウェアエミュレーションの完成度がよくないと思っているんです。リコンパイラ部分はしばらくするとPCSX2プロジェクトにコントリビュートするなどの方法で公開(OpenSource、GPL)するので、それをTobiasさんには組み込んでほしいと思っていたりします。


だれか私の気持ちを英語で代弁してくれる人いないですかね?^^;

Windows XP x64 Editionと追加ハードディスクを通販で購入したのですが、やっと、昨日になって自宅に届きました。


週末はWindows XP x64 Editionのインストールと開発環境の構築ですね。


さて、いままでは、32ビット環境において、まずはSSSPSXのR3000AリコンパイラをPCSX2に組み込む作業をしていました。

まあ、R5900の8分の1のクロックで動作しているR3000Aですから、R3000Aの部分が高速になったとしても、全体の負荷

からみるとほんのわずかだと予測はしていたのですが、そのとおりでした。


まずは、私の環境での、PCSX2 0.9.1 TLB 版の性能です。35.3 FPSでました。ドラクエの画面ですね。

PCSX2 0.9.1 TLB


上記のR3000AリコンパイラをSSSPSXのものに置き換えてみたものです。38.0 FPSにあがりました。

PCSX2 0.9.1 TLB SSSPSX rec


LW命令やSW命令において、psxMemRead32関数やpsxMemWrite32関数の呼び出し方法が最適化

していないので、もう少し性能はあがりそうです。


さて、次はx64環境を作って、R3000AリコンパイラのチューニングやR5900リコンパイラの作成に進みましょうか。

PCSX2 powered by SSSPSX recompiler for x64の開発をはじめました。


これは、PCSX2にSSSPSXリコンパイラの高速化技術を組み込んで、ゲームプレイが可能なレベルまで性能を向上させることが目的です。


まずは開発になれたR3000Aリコンパイラの部分から高速化に取り組んでいます。


少し、PCSX2のソースプログラムを読んだ限りでは、

1) R3000Aリコンパイラは高速化の余地がかなり残されている。

2) R5900リコンパイラはx64対応にすることで早くなりそうだ。

3) VU0とVU1も高速化すべきだろう。

4) メモリマネージャは、VM版よりTLB版を改善していった方が筋がよさそうだ。

5) スレッドマネージャを開発して、R3000A、R5900、VU0、VU1を別々のコアで動作させたい。

といった感想です。1)、2)、4)はどうしてもやっておきたいですね。