CPU実験室

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

LEDチカチカ(2)

算術命令が動かない、となるとDSP自体にバグがあるとか・・だいたい実装しているのが正規版のDSP56001ではなくてエンジニアサンプル版のXSP56001な訳で。・・あるいはこの現象にも似ているのでDSPのハード的な使い方に重大なミスがあるんじゃないかと。でマニュアルを始めから読み直していたのですが突き当たったのが

all arithmetic instructions assume a fractional, twos complement data representation.

という一文です。つまりX0のような24bitレジスタであれば最上位D23bitが符号bit、次のD22bitとの間に仮想的な小数点があるQ23フォーマットXのような48bitレジスタやアキュームレータAのような56bitレジスタではQ47フォーマットを想定してることになります

 

これらのレジスタ間の算術演算では24bitレジスタは小数点位置を揃えるために左詰め(LSB方向に24bit分0拡張)されるのでアキュームレータAの下位24bitは何も変化しないことになります

この他データレジスタには飽和モード:正の最大値0x7FFFFF、負の最大値0x800000をリミットとしてオーバー・アンダーフローさせないなど固定小数点演算に特化した機能があって、かえって整数やビットパタンを取り扱うのは得意じゃないということのようです。

これではLEDがチカチカしないのは当然で、ではどうするかというと整数しか入りえないアドレスレジスタRnをカウントアップすることにします。ただアドレスレジスタに対するADD命令や単独でインクリメントする命令は無い(たぶん)のでポストインクリメント付きレジスタ間接アドレッシングでダミー読出しMOVE X:(R0)+,AしてR0をインクリメントさせます

このプログラムを実行させるとLEDチカチカは成功しました。最下位ビットが1キャラクタの転送周期3.84kHzで点滅するので最上位ビットは3840/256=15Hzの点滅となり目で見えるLEDチカチカになりました。静止画ではわかりませんが。

 

シリアルにも連続してインクリメントデータが出力されました。ターミナルで受信すれば結果は明らかです