sound_mixer
618 lc, 4 M4K -> 456 lc,3 M4K (注:sound_mixer の外に移動したものもあるので単純比較しづらい)
- sound mixer は sound clock 側の処理を cpu clock 側での移動をしました. これによって cpu clock 側から sound clock 側へ制御データを渡す必要がなくなり dual clock fifo (浅いので 0 M4K) の削除をしました.
- ADPCM 専用 fifo と CDDA 専用 fifo はともに dual clock でしたが single clock になり, CDDA 専用 fifo は CD-ROM fifo と兼用になりました.
- cpu clock から sound clock への fifo は ADPCM と CDDA を加算していましたが、 0 M4K の浅い fifo で 17 bit 渡すよりかは浅くても 1 M4K の 25 bit にして 2 音源を加算するのは sound clock 側にしました. これにより 24bit 符号あり clipping 加算回路が1つ減りました. (なお加算回路が1個減っても雀の涙)
- fadeout contoller は計算したところ更新のため時間精度をそこまでだす必要がなさそうなので精度を落としました.
sound_mixer.msm5205 (外)
msm5205 へ入力する更新頻度のための分周用定数テーブルは 16 word 10 + 3 +3 bit となっておりましたが. 16 word 1 + 3 + 3 bit に削減しました. この 10 bit の値は下記の式で計算してました.
(44.1 * 10 ** 3 * 128) / 9.214*10**6 / n n = 1 から 16
細かい近似の部分の説明は省略しますが、 n = 16 の値だけを算出しレジスタに書かれる n は param 回ループを回すと param/16 倍となり 10 bit の計算結果はいりません.
これでも 40 lc 程度削りました. (雀の涙)
sound_mixer.msm5205 (内)
2 M4K -> 1 M4K
PCM の値を更新する定数テーブルがありまして、 address 49 * 8 words, data 12 bit の ROM が必要でした. 計算は mame のコードを手直ししたものが下記になります.
/* loop over all possible steps */ for (step = 0; step <= 48; step++) { /* compute the step value */ int nib; int stepval = floor (16.0 * pow (11.0 / 10.0, (double)step)); /* loop over all nibbles and compute the difference */ for (nib = 0; nib < 16; nib++) { int16_t v = 0; if(nib & 4){ v += stepval; } stapval >>= 1; if(nib & 2){ v += stepval; } stapval >>= 1; if(nib & 1){ v += stepval; } stapval >>= 1; v += stepval; if(nib & 8){ v *= -1; } voice->diff_lookup[(step<<4) + nib] = v; } }
nib の bit3 は 1 倍か -1 倍なので動的に計算します. nib の bit2:0 は乗算ぽいのですが右シフト演算が入るので乗算ではないです. ためしに乗算に置き換えてみたら voice はちゃんとでませんでした.
この式通りにハードウェアで加算する場合 fllor() の演算結果を 49 word x 12 bit の table にするので先述のように単純に ROM にすると 2 M4K も食います.
計算結果を眺めていたら 1/3 ぐらいは上位ビットが 0 で埋まっているのに気づきました. ROM の data width は 9 bit なので address に応じて有効な data bit 数を 6, 9, 12 にわけまして, 6 bit の領域の上位に 12 bit の bit11:9 を埋めるなどで詰めていったら 9bit x 512 word の 1 M4K に収まりました.
単純な ROM とは違いますが定数テーブルや加算回路がなくなりまして MSM5205 の回路使用量は半分になりました. (なお雀の涙)
videotomcu:vtom
1 M4K -> 0 M4K
使用していたのは 2bit で深さ 4 word だけでしたので logic cell にしました.
その代わりに audio_mixer の音声データ fifo に 1 M4K を割り当てました.
pce_bridge_cpu_vce.colorram
2 M4K -> 1 M4K
単純に無駄だったので減らしました.
終わり
- audio_mixer のソースはかなりきれいになりました. 正直な感想は回路数は大して減ってないのがつらいです.
- これらの作業により 3 M4K を捻出できましたので、 FIFO の深さを 0x800 byte, 4 M4K にすることができます.
- なんで 2019年に EP2C5 にマジになっているのか、設計時点で EP2C5 を選んだことをすごく後悔しました.
MSM5205 のデコードの部分は処理速度を求めるわけでもないので、MCU に処理させても良さそうです. ソフトならこんなに無理して定数テーブル削るなんてやる必要ないですから. 構造的にはハードで転送をしているのでそこだけソフトでやるのはすごく手間なんでやりませんが、1から作り直すならエミュレータでいいかなと思いました.