CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

モデュロアドレッシング

DSP56001に実装されているモデュロアドレッシングは修飾レジスタMnの値によりM=2~32kBの任意長のリングバッファを構成することができます。(Mn=0のときは特殊でFFTで使うビットリバースアドレッシングになります)

ただこれには結構制約があってM=32768までということとM≦2^kを満たす2^kアラインのアドレスからしかバッファを置けない、つまりM=32768であればスタートアドレスは$0000$8000に限るということです

それだったらモデュロアドレッシングは使わずに、サイズを2^kに限ればポインタに2^k-1のマスクを掛ければモジュロ演算したことになり、さらにポインタは16bitなので放っておいても$FFFFの次はオーバーフローして$0000になるサイズ64kBのリングバッファになってしまいます。さいわいYデータ空間は$100~$1FFの内蔵ROMを禁止し、$FFC0~$FFFFのユーザI/O空間もRAMで埋めているので丸々64kBの空きエリアを確保できます

コードは修飾レジスタMnの設定をやめただけ。

ポインタの初期値はリードポインタのすぐ後ろにライトポインタを置いて最大遅延が得られるようにしました。これで65536/48kHz=1.36秒。音速からいえば片道230mの距離の山彦になります

delayサブルーチンでリングバッファへの書込み、読出しをしていますがここでポインタを弄ってイタズラができます

①は1フレームの間に同じデータを2回書いて書込みポインタを2個進めているので相対的に読出しが遅くなり1オクターブ低い声でゆっくり再生されます

②は1フレームの間に同じデータを2回読出して読出しポインタを2個進めているので相対的に読出しが速くなり1オクターブ高い声で早口で再生されます

おもしろいのが③で読出しポインタをポストデクリメントしているのでリアルタイムで逆再生ボイスになります。日本語を逆再生すると韓国語のように聞こえるのですがこれは韓国語の音節が子音で終わるものがあることに関係するようです