MAME たん(長くなったので、その2) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

MAME たん(長くなったので、その2)

darius2_psp
(こっちの方向でいいかな~)

darius1_psp
(クジラ以外認めん!...なんて偏狭な)

coiiiin (写真はPS版で<略>?)
harrier_tan (写真はX-680*0版で<略>?)
turbo_kun (写真はFM-T*WNS版で<略>?)
chicken_run (写真はチキンランで<略>?) ■2007年、ついに<以下略>
■カンケー無いケド、「GensのFM音源」は、「見るべきテクノロジー」がタクサンある。 ワカル人にしかワカランが、どおせココはそーゆーぺえじだしさ。 「GensのFM音源」は、速い。「MAMEのFM音源」はトロイ。 NJ氏のMVSだって、未だに「MAMEのFM音源」。 「MAMEのFM音源」を高速化出来れば、価値がある。 ■まず「本物のFM音源」の特性として、「アルゴリズム(AR)(各オペレーターの接続順序)」は「高速に切り替えられない」 とゆー特性がある。(それ以前に、本物のFM音源は「レジスタアクセス」がトロイ(ウェイトが要る)んだが...) 「GensのFM音源」は、「UPDATE_ONE()の途中でアルゴリズムが切り替わる」事は想定してないが、 これは本物だってそうなんだから、正しい。 1.「UPDATE_ONE()の途中でアルゴリズムが切り替わる」事は、ありえない。 ■「MAMEのFM音源」は「サインテーブル」を素直に、使ってるが「GensのFM音源」は、「サインテーブル」は「出力テーブルへのポインタ」だ。 非常に合理的。それにこの「出力テーブル(TLのテーブル)(トータルレベルのテーブル)」で「範囲外」になった場合出力は「0」だが、 「MAMEのFM音源」は「if文で判定」するが「GensのFM音源」は、「テーブル長さを始めから2倍」にしておき、空きには「0」が入ってるので、 「判定自体が無い」 (註:この話は、UPDATE_ONE()ループの「最深部分」つまり、多重ループの「一番内側」の話) (註:FM音源えみゅは要するにUPDATE_ONE()ループが重過ぎるので、トロイ) (註:但しPSPで単純に「MAMEのFM音源」のTLテーブルを二倍にし、判定を取ったら「遅く」なった。 「TLテーブル自体の長さ(や実装を)」を見直さないとダメ。MAMEの奴は「一次元配列風、二次元配列」(envがある)) ■「GensのFM音源」は、「Gensの76496音源」と同じく、「length ループが散在して小さい(チャンネル毎レンダーし後で合成)」 これは一見「MAMEのFM音源」や「MAMEの76496音源」の「巨大 length ループが一つの一括レンダー」の方が効率が良さそうだが、 この方式は、「酷く効率が悪い」多分原因は「一次キャッシュ(やRISCのレジスタ)が壊れてキャッシュにのらないから」なんじゃないかな? 小さな length ループでチャンネル毎レンダーし、後でミキシングした方が(処理量は増えても)「どんなPCでも速い」 (2007-02/08、06:21)
■YM2151日記。 えっと、MAMEの2151ってさ。他のFM音源は、fm.cで統合されてるのにさ。一つだけ仲間外れなんだよな。 それって、「DT2」があるから?。まーそれもあるんだケドさ。どっちかってゆーと「めんどくさいから途中で投げ出してある」 ってのが真相っぽい。 だ、だって「傍証」があるもん。そりゃイインだが、特に「レジスタ#15(0x0f)のノイズ」はさ。 「N - - P P P P P」 Noise: 0:off 1:on -:不明か未使用. P:period らしい。 んで「ノイズ有効ビット」は使ってるケド「period」は「使ってない」現在(MAME1.12)のym2151えみゅはさ。
CH7のノイズはさ「ワザワザ専用のchan7_calc()」でやってるケド。これ殆ど「汎用のchan_calc()」と同じなんだよな。 CH7のノイズは、「最終段キャリア(c2)と入れ替えて発生する」処ダケ違う。C言語で書くと、
en3 = volume_calc(3); /* C2 */ /* SLOT 4 */ if((7==chan) &&(PSG->noiseCH7 & 0x80)) /* ch#07の特殊ノイズ(発生条件は#0fレジスタのMSB(0x80)のみ) */ { UINT32 noiseout; /* ここが現状のノイズルーチン。「priod」は使ってない */ noiseout = 0; if (en3 < 0x3ff) noiseout = (en3 ^ 0x3ff) * 2; /* range of the YM2151 noise output is -2044 to 2040 */ chanout[7] += ((PSG->noise_rng&0x10000) ? noiseout: -noiseout); /* bit 16 -> output */ } else /* 通常時(ch#0~ch#6まで) */ { if (en3 < ENV_QUIET) op_calc3(); }
(註:あくまで「原理」の説明。このとおり書けば「遅くなる」タブン。変数名とかも少し変えてある)
こんなん。結局つまり「(CH7ノイズは)まだヨクワカラン」って事。(だってperiod使う筈でしょ?本来。設定するんだからさ)
訂正:「period」は「noise_f」にいれて、ノイズテーブル経由で出してる。
カンケーナイケド、「mem_connect」「mem_value」は「slot毎」じゃなくて「ch毎」ですね。「fm.c」見て気が付いたんだケド。 「slot毎」の「connect」も「判りづらい」よ。fm.cの「connect1~connect4」の方が、まだ判りやすい。ついでに言うと、 「connect4」は要らんよなあ。fm.cは関数に与える都合上使ってるが本来要らん。
MAMEのfm.c。「setup_connection()」も解かりづらいよなあ。 /* set algorithm connection */ static void setup_connection( FM_CH *CH, int ch ) { INT32 *carrier = &out_fm[ch]; INT32 **om1 = &CH->connect1; INT32 **om2 = &CH->connect3; INT32 **oc1 = &CH->connect2; INT32 **memc = &CH->mem_connect; switch( CH->ALGO ){ case 0: /* M1---C1---MEM---M2---C2---OUT */ *om1 = &c1; *oc1 = &mem; *om2 = &c2; *memc= &m2; break; <中略> case 5: /* +----C1----+ */ /* M1-+-MEM---M2-+-OUT */ /* +----C2----+ */ *om1 = 0; /* special mark */ *oc1 = carrier; *om2 = carrier; *memc= &m2; break; <以下略> はさ、「ポインタを使わないで書けば」
/* set algorithm connection */ static void setup_connection( FM_CH *CH, int ch ) { //ここは(原理の説明だから)イラネ switch( CH->ALGO ){ case 0: /* M1---C1---MEM---M2---C2---OUT */ CH->connect1 = &c1; CH->connect2 = &mem; CH->connect3 = &c2; CH->mem_connect = &m2; break; <中略> case 5: /* +----C1----+ */ /* M1-+-MEM---M2-+-OUT */ /* +----C2----+ */ CH->connect1 = 0; /* special mark */ CH->connect2 = &out_fm[ch]; /* キャリアはつまり出力 */ CH->connect3 = &out_fm[ch]; /* キャリアはつまり出力 */ CH->mem_connect = &m2; break; <以下略>
つまり、こういう「意味」だよ。速度気にしないなら、これでも動作する。 まー「速度」は「同じ」かもしんないけど。 (註:「コンパイラの最適化で同じコードになるかも」とゆー意味) (註:これも、あくまで「原理」の説明) (註:「static 変数」で「c1 mem c2 m2」用意してるが、速いんだか遅いんだか(???)) (2007-02/08、15:18)
■んと、たあぼ/あうとらん、に関しては、まーなんとかなってきた、きがする。んがとてつもなく不安定。 不安定なのは、やっぱMAMEのストリームじゃあダメっぽい。namco86の真似して専用soundにすりゃあ、 いいんだろーケド。まだ実験してない。とてつもなく不安定だけど、(とりあえずめんどくさいから)UPしちゃおかな~(悩)。
「はんぐおん」や「すぺはり」は現在画面が出るだけで、げえむは「夢のまた夢」な速度(とてつもなくトロイ)んが、 どーせ実験だし。次のターゲットはこいつにしよか悩み中。 (2007-03/05、23:45、悩み多き年頃)
■ま、まさか「こい~ぃん(仮称)」まで動くとは、...恐るべし。エスパーmameさんゴメ。だ、だって当時は本当にそう思ってたにょ。 「たぼ」よか、「こい~ぃん」のほーがメモリキビシーしさあ。 (2007-03/23、23:15)
「こい~ぃん」はどおなるかワカラナイ。PSPSDKじゃあキビシクてPSPDEVに戻ったほーがてっとりばやいかも、しれん。 地味にruka氏の気持ちがワカル今日この頃...。sfcガンガッテネ(はあと)
「たぼ」は、もちっとまし(対してカワランが)になってるし、忍者くんも、稼動はしてるし、FZも思い切って簡略化したので、 全然まったくチガク(速く)なってる。(但しFZは「終了出来ない」)。だけどUPめんどいなー。 (註:阿修羅の章が動かなかった原因は、純粋に「メモリ不足」でした>Cど素人氏) (2007-03/23、23:55、めんどいから、も少しなまけてよー)
■えっとさ全然マッタクMAMEとカンケー無いケド、某コード実験室でTYL実験してるからさ。「myちょーテキトーカスタム版sfc」を、 (註:テキトーにカスタマイズしたら、「終了時に青画面」が出るのでやんなって投げ出した奴。myHDD内で地味に生息中) 「0002diff-src.zip」のとうりに書き換えて試た。確かに3kBytes程小さくなった。速度は速くなった気がする。 次に「0003diff-src.zip」はリンクされてないが、あるべき場所にあるので、落として変更。約15kbytes程小さくなる筈だが、 約73kbytes程大きくなった。速度はヨクワカラン。元々テキトーカスタムなので不安定だがマスマス不安定になった。 メニュー行き来すると死ぬ。sfcはっきり言ってシロートにはゼンゼンワカランなー。 (2007-03/28、01:50)

■コメントは、この下に入れてね。