2021-09-04 22:52 — asano
カテゴリー:
CDP1802のハードウェアができたのでいつものようにUniversal Monitorを移植していきます。
以前SC/MP使いの憂鬱で書いたようにSC/MPはかなり癖の強いアーキテクチャでしたが、このCOSMACも負けず劣らずですね。
- PCがない
プログラムカウンタに相当するものが無いわけではありません。複数あるレジスタのどれをプログラムカウンタとして使うか選択できるようになっています。専用のものがないという点でだいぶ変わっています。 - メモリアクセスのしにくさ
アドレスを直接指定してメモリアクセスすることができず、常にR(n)レジスタ間接でアクセスしなくてはなりません。これはSC/MPも同様でしたが、SC/MPと異なりディスプレースメントが使えないのでアクセス先毎にレジスタを割り当てるかレジスタを書き換える必要があります。書き換えは8ビットごとにDレジスタ経由で行わなくてはなりませんので、頻繁にアクセスするものは隣接アドレスに配置してINC
/DEC
を使うのが良さそうです。
救いはアドレス指定に使えるR(n)レジスタが16本もあることですが、PC,SPもこの中から選ぶわけですし、割り込みやDMAを使うならそれにも使います。メモリポインタ以外にも使いますし、そう余裕は無いなというのがモニタ書いてみた感想です。 - データレジスタD
一般的なプロセッサのアキュムレータに相当するのがデータレジスタDですが、これを使わないとできないことが多すぎて長期間値をおいておくことができません。
私がまだ慣れていないせいもありますが、おかげでR(n)とDの間で転送する命令だらけのプログラムになってしまいました。 - 比較命令が無い
比較命令が無いので減算命令を使うしかありません。いわゆるフラグレジスタがキャリーに相当するDFしか無いのでしかたないのですが。
減算命令に一般的な dst - src → dst 以外に src - dst → dst もあるのは面白いです。 - ブランチの飛び先
条件ブランチ命令の飛び先は8ビットで指定しますがPC相対ではありません。PCとして使っているR(P)の下位8ビットに代入するだけなので256バイトのページ境界を越えたブランチはできません。
プログラムが修正で増減すると思わぬところのブランチが届かなくなって焦ることがあります。 - 演算命令のソース
演算命令はDとメモリ(イミディエート含む)間のみです。80系から入った人間なのでついレジスタにいろいろ置いておこうとしますが、そうするといざ演算の時に困ることになります。
モニタでは演算命令のほとんどはイミディエートなので問題ありませんが、例えばD(ump)命令の処理では処理中アドレスはレジスタR(A)に終了アドレスはメモリに置いています。前者は随時インクリメントしながらメモリを読む必要があるのでレジスタに置いておく必要があります。一方後者をレジスタに置いてしまうと比較のたびにどちらかをメモリにコピーしなくてはならなくなります。 - サブルーチンコールの仕組みがない
最初はSC/MPのようなマクロを書こうとしたのですが...、これについては長くなりそうなので別途書こうと思います。
参考文献・関連図書:
CDP1802AC/3データシート, Intersil.
コメントを追加