#3GEN日記いじればいじるほど遅くなる。
■いじればいじるほど遅くなる。(2006-01/19) 昨日もDGENを弄ってた。 (注:このDGENは1.00です。最新のDGENはもっとずっと進んでいます。 スキルがあり、開発をしたい方は開発者に直接コンタクトをとって下さい。 私は開発者とは全く関係のない第三者です。 あくまでこのページの話は実験用途(教育用)です。)
いじればいじるほど遅くなる。 RISCを甘く考えていたらしい。 どうも普通のPC以上にキャッシュが重要だ。 っていうか、ことごとく普通のPCでキャッシュの大きい/小さいのレベルで考えるバランス感覚とは、 だいぶ違う。 C++での記述してあるクラスを破壊してCに変更したとしても、返って速度が低下するかもしれない。 なぜなら、STATICにして明示的に中に閉じ込めて置けば大丈夫かもしれないけど、 クラスから開放されて、実行ファイルの配置位置がとっ散らかるからだ。 それにリンカの場合によりけりだが、(このリンカの特性に詳しくない。これはMAPファイルを読む) 杞憂かも知れないが、 関数もとっち散らかるかもしれない。まあ、このへんは余計な心配かもしれないが、 そう単純でもなさそうだ。 現状少しクラスの外に出したりしてるが、遅くなったり、変わらなかったり、している。 VDPレジスタをキャッシュ式にしたらかなり速度が低下した。(38→34)fpsぐらい。 同じ部分を最新のDGEN120で実行すると(40~45)fpsぐらい。fpsが一定ではない。 これは速度のチェックだから、VSYNCなし、最大60fps、フレームスキップ0(こま落としなし)、 それから音源はONで11025kHzの設定時。 某ゲームの一部の場所でfpsが一定する部分があるので、そこで見た。 (BGが重ね合わせ多重スクロール、OBJ殆ど出ない、音源Z80鳴りっぱなし、の場所) 失敗は成功の元。 速度が低下するのは、ここ(つまりメモリ関係)がとても重要だからだ。 詳しくソースを見てないが、もしかしたらDMA転送が、 VDPコマンドを呼ぶのかもしれない。 (その場合はとてつもなく遅くなりそうな事が容易に想像つくでしょ?) 速くなるROMカートリッジも存在するので、それは多分VDPコマンドのDMAを使ってないんだろう。 (上記の実験カートリッジは、明らかにDMA使ってる。) つまり、メモリ関係をブラッシュアップすれば速くなる可能性を秘めている。
音源の初期化テーブルを少し削ったら(141/256)、サイズが少し小さくなった。 「sn76496.c」 前略 #ifdef _PSP10 extern short gain_table[][15]; #endif //_PSP10 static void SN76496_set_volume(/*int chip,*/int volume,int gain) { #ifdef _PSP10 //struct SN76496 *R = &sn[0/*chip*/]; int i; gain &= 0xff; for (i = 0;i < 15;i++) { SN76496_VolTable[i] = ((gain<141)?(gain_table[gain][i]):(10922)); } SN76496_VolTable[15] = 0; #else //_PSP1 後略
このテーブルは、大体あってるが、本質的には正確ではない。MAMEのあれ(ゲイン特性関数)は近似式。 (頭とお尻を合わせただけ)。実機は微妙にカーブが違う。これはオシロで測定してみれば、すぐ判る。 MAMEではそこまでやってない。(測定に手間かかりすぎ) でも、YMのADPCMデーターとかは、ちゃんとサンプリングしてるんだよ。(やるなあ) この問題はPSG/SSG(AY-3-何だっけ)でも共通で、いまだに解決してない。 まあ、常人にはこんな細かい事どおでもいいだろうけど、実機で再生し録音したの サンプリングデーターとエミュが吐き出したサンプリングデーターを一致させたいのならば、 必須の作業なんですけど。(既にそれは可能な時代だ)
だから、本家(さとうたつゆき様)のソースがそうなんだから、適当な近似式で良い。 (人間の耳じゃ違いわからんし)。 PSPの場合テーブルなんて(そんなくだらない事でキャッシュフローすると)勿体無いから、 近似式にしてしまえ。(整数で作るとしても。logの多項式展開がめんどくさければ、 二重の等差数列って手もあるし)
そうそう、音源関係も少し手を入れたが、パフォーマンス的には、 殆ど変わらない。 でも、多少は良くなってるみたい。 DGENは、MAMEとかと違ってクロックの設定は基本的にとっ散らかって入ってる。 一っ個所だけちょっと違いそうなんで、手をいれた。
DGENはもともとフランスのエミュで、PALは詳しいらしいが、 NTSCはちょっと...(タイミングがよくわからん)という事らしい。お風呂にいってきまーす。■ミニミニ、プロジェクトX((横暴過ぎるので削除)恐らく世界一正確なXTAL情報。 GENSよりもMAMEよりも) みんなメガドライブ(NTSC)のクロックについて知らなすぎるので、特別レクチャー。 まずマスターXTALは、53.693175MHz。 水晶本体に53.693と書いてあっても、この周波数だ。 当時の水晶業界は近傍に似た周波数がないのをいい事に、 下3桁を省略して記述する癖があった。 区別できりゃあいい、それよか印刷のインク代がもったいないし、 読みにくいという、今からすれば考えられない事が常識だった。 「常識」は一般人は知らなくてよい、技術者だけが知っていればよいという風潮だった。 この周波数は特別な周波数だから、これ以外にはないし、理由もある。 NTSCは今まで白黒テレビだったのに、カラーテレビになったので生まれた規格だ。 白黒のY信号(輝度信号)の他に、カラーのC信号(色差信号)が追加された。 このY、C信号が直に出てるのがいわゆるS端子。 (色差信号:色情報は「HUE」つまり360度の角度で表し、次のドットの色との差分を 角度で持っている。つまり、+30度、-23度、...等。延々信号(アナログの波形)に なってる訳。これで色が変えられるし付けられる) もともと、テレビというものは、FMラジオと原理がいっしょだ。 FM変調する為には、基準となる。搬送波がいる。この搬送波に、画像信号(ラジオの場合は音声信号) を畳み込んで(FM変調して)その電波を送るのが基本原理。 カラーになって、C信号が増えたのは、何とかしなければならない。 幸い人間の視覚特性を検証してみた所、人間の特性としてカラーの質が落ちても、 白黒画像の質が保たれていれば、きれいに感じるという事が判明。 この原理を悪用?したのが、いわゆるJPEG。メタメタに色信号圧縮してあるから、サイズが小さい。 (ここからは、波形の話ではなくて、周波数帯域の説明です。念のため) そんでチャンネルの端っこにテレビ用の音声帯域があった。(後期ではステレオに拡張された) (これを直に受信するとFMラジオでTVの音声が聞ける。原理が全く同じだからだ) しかも、都合のいい事にY信号は(FM変調した結果なので)帯域全部を使っておらず、 (これは安いラジカセで極端な低音や極端な高音を録音しても消えてしまうのと似たしくみ。 専門用語おなかいっぱいなら上手く説明できるんだが、私の説明力ではこの程度) 櫛状(ウェイブ状、今でいうウェイブレット関数風、つまり櫛状で両端は減衰)に たくさんつかったり、少し使ったりしている。 だから、新しく拡張した。C信号は、(これも都合のいい事にFM変調すれば櫛状になる) Y信号と音声信号の中間地点付近の丁度よさげな場所に配置した。(そういう理由なんです) + 信号の強さ A Y信号(画像) | C信号(色) | | | | | : | | | | | | | :音声信号(2つ) | | | | | | | | | : | | | | | | | | | | | : | | | | | | | | | | | || | : | | | | | | | | | | | |||||||: --+--------------|-----------|--|---->周波数+ | |<--3.57--> | Y中心 C中心 | (俗にいうテレビのチャンネル) Y信号と重なりにくい様に、半波ずらして重ねた。 そのY信号の搬送波(中心)からC信号の搬送波(中心)までの距離が、 3.579545MHz。NTSC規格で決まっている。 3.57や3.58と書いてあったら、間違いなく3.579545MHz。 にた周波数は製造されていない。 たとえば3.570000MHzと書いてあっても3.579545MHz。 3.570000MHzは特注しない限り、水晶会社が作ってないんだから、 民生品で存在する訳がない。万が一あったらそれは100%軍事用途だ。 もし測定できたら、技術者は測定機の精度を疑う。 この3.570000MHzというものが存在する理由は、技術を知らない現場が 勝手に数字を補ったり(例えばラベルの製造機が小数点以下6桁タイプに更新された) 技術の継承がないので、勝手に思い込んで(だって書いてあるし)発生した数字だ。 さて、一方SEGA。メガドラは初期版にXTALが四つも乗っていたのは(もっとだっけ?) 設計どうりに動かなかったからだ。コスト無視のパッチあてがしてあったろう。 チップのバグが出たのなら、なにもあんな太い線で配線する必要など何処にもない。 あれはクロックラインだから、嫌でも太くする必要があった。 基盤がベークライトの超安物だった。 ガラエポ基盤のアーケードマシンの基盤を設計する感覚で設計してしまったので、 クロックラインがどうしても安定しない。
話がそれて来たようだ。 当時一般人が買う68000の価格が一万ぐらい。Z80数千円。メモリ数千円~万円。 クリスタル一個¥500~¥1000ぐらい。 メーカーが大量仕入れすれば、コストが安くなるが、メガドラ本体の定価が¥21000。 2万を切っている店はなかったし、まだ売れるんだかどうだかよく判らない。 クリスタルは(当時)それなりに高い部品だ。 今みたいに、10円以下のチップ1つで、あらゆる周波数が取り出せる時代とは桁が違う。 クリスタル四つも使って、量産すれば、完全な赤字だ。メモリも高いんだし。 (当時最先端のデュアルポートRAMと言うものをVRAMとして使用していた。(X68000でも採用された)書き込みしながら、同時に読み込み(表示)できる。 当時のPCはPC88やPC98やFM77AVやX1。これらは表示中に無理やり 書き込むとVRAMが単なるDRAMなので、物凄いノイズが発生した。 特にFM77AVは実パレットが4096個もあったので、画像を表示しつつ 全パレットを更新する為には、数Vsync必要という技術力が無ければ厳しい仕様。 後にHsyncの戻りにパレットを更新するという技術が開発され、改善した。 (発売時の販促デモで使用された) 要するにラスターパレットだ。ただしラスター割り込みなどない。自前で監視する。 この技術はアーケードゲーム業界に多分N社のA氏が広め、メガドラにも輸入されて、 それがN社のBF。世間は意外と狭い。) だからメガドラはとにかくクリスタル一個で動作する様に設計されていた。
その一個のクリスタルの周波数は正確に53.693175MHz。==XTAL。 7.5分周回路で、68000に供給。(XTAL/7.5)=7.159090MHz。 当時のカタログには7.16MHzと表記されていた。 NTSC回路(SONYの汎用チップ)にはC信号の基準搬送波を入力する必要があり、 それが3.579545MHz。これは(XTAL/15)==3.579545MHz。 Z80もこのXTALを使い、たぶん(XTAL/13.5)==3.977272MHz。 当時のカタログには約4MHzと表記されていた。でも、初期のメガドラには4.000000MHzのクリスタル乗ってて、 そこから取っているのかも知れない。8.000000MHzとかも乗ってるが、 どおなっているのか、現物を確認してない。既に初期版から完全な互換性がない。運命の十字架を背負ったハードなのだよ。 判った?
で、DGEN100のソース。「MDFR.CPP」 #define _scanlength (pal? ((7189547/50/0x138)) : (490)) //(8000000/60/0x106)) 違うだろ。 #define _scanlength (pal? ((7189547/50/0x138)) : (455)) //(7159090/60/0x106))
追記:2006-04/05. えーだって、セガ公式ページでは、7.67MHzだよ。 そりゃ、「公式ページが間違っとるんやろ」
よくある事だから、気にするな。 それで、megasisの7.67MHzが出てきた訳か。(わたしは、ずーっと謎だった) (注:古いPCのメガドラエミュ。途中の版でクロックが弄れる機能があったが、何故か初期値が7.67MHz) 納得。みーーんなセガが悪いんじゃねえか。 メガドラ1でごにょごにょあって、うやむやに誤魔化した「事件」があったんだけど。 ここには書けんが、いろいろあるの!!
■サウンドの謎。 今某ゲーム(BFの03)のサウンドテストで (このゲームはFM6(とPSG?)しか使ってない。PCMはなし) FM音源のチェック中なんですが、
OFF | 78fps |
11025kHz | 64~65fps |
22050kHz | 68~69fps |
44100kHz | 68~69fps |
なんで、音質悪い方が重いんや!
OFF | 79fps |
11025kHz | 69fps |
22050kHz | 65~66fps |
44100kHz | 56~58fps |
OFF | 78fps |
11025kHz | 68fps |
22050kHz | 63~64fps |
44100kHz | 54~55fps |
■ツールチェイン再び。 うちの開発環境はたぶんPSPSDKですが、「toolchain.sh」は一度も動作させてないし、 使ってません。「詳しくはHelloworld日記」 あれから、再び情報を少し調べて「Pen4マシンでツールチェイン実行し終わるのにX時間かかった」 等と書いてあるページもあったし、触らぬ神にたたりなしってとこで、いまだにやってませんが。 今日(2006-1/19)HDDの容量がなくなってきたので、ゴミ消し作業をしてたのですが、 (CD焼かなくても、残り100MB→288MBに延命した。) (あんまりくだらないものCDに焼くとあとで混乱して困る。) 「toolchain.sh」なんとなく覗いてたんですが、
「X時間かかったっていうのは マシンの性能関係なくて あんたのネットがとろいからや!」
あほらし。ツールチェイン自体は、 $WGET ftp://ftp.gnu.org/pub/gnu/binutils/$BINUTILS.tar.gz || { echo "DL失敗"; $WGET ftp://ftp.gnu.org/pub/gnu/gcc/$GCC/$GCC.tar.bz2 || { echo "DL失敗でちゅ"; $WGET ftp://sources.redhat.com/pub/newlib/$NEWLIB.tar.gz || { echo "DL失敗"; の三つを(GCC,ライブラリ、ユーティリティー)ネットから落としてきて、 (つまりこのページでやってるのと同じことです) 足りないものは、 ## Grab the latest PSPSDK from Subversion. if test $BUILD_PSPSDK ; then rm -Rf pspsdk $SVN checkout svn://svn.pspdev.org/psp/trunk/pspsdk fi って感じで、「SVN」でなんとかするみたいです。 上に貼ってあるのはバッチの一部で、例えば$ABCって表記はABCって名前の変数。(環境変数) つまり環境依存部分ですね。上のは適当に「URL」が書いてあるところを、コピペしたんで深い意味は ないです。
「SVN」っていうのは、要するに最新のソースを取得できるシステムです。 手でやるんなら、 svn checkout svn://svn.pspdev.org/psp/trunk/pspsdk って感じです。
■(2006-04/27、追記) GCCって、 http://ftp.gnu.org/pub/gnu/gcc/ で、直接取ってこれるんだな。(FTPをHTTP開放してる為)知らなかった。まあ、よく考えりゃ。あたりまえだけどさ。 最新版は410なんだ。えっと最近のGCC一覧。(動向)2006-04/27、現在。 340 341 342 343 344 ←synz氏はこれ。(環境作成済みZIPが存在する) 345 346 400 ←このブログでは現在これ。(環境作成済みZIPが存在する)「PSPSDK以前」 401 402 ←nko氏は、これで環境作成、成功した。(自分でtoolschain.shを動かす)「これは多分PSPSDK」 403 ←40Xでは最終版になるんだ。一応公式の最新版。 410 ←現在βっぽい。まだ時期早尚。 註:PSP用のGCCに改造する為。パッチ当てないと駄目だからな。名前だけ一緒なの。念の為。 詳しくはtoolchain,shを読む。