 (こっちの方向でいいかな~)
(こっちの方向でいいかな~)
 (クジラ以外認めん!...なんて偏狭な)
(クジラ以外認めん!...なんて偏狭な)
 (写真はPS版で<略>?)
(写真はPS版で<略>?)
 (写真はX-680*0版で<略>?)
(写真はX-680*0版で<略>?)
 (写真はFM-T*WNS版で<略>?)
(写真はFM-T*WNS版で<略>?)
 (写真はチキンランで<略>?)
(写真はチキンランで<略>?)
■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)
■コメントは、この下に入れてね。