2019-10-03 22:21 — asano
SC/MPボードにUniversal Monitorの移植を始めたのですが、前にも書いたように癖が強くて大変です。
そこで移植をしていて「げっ」と思ったことを書いてみたいと思います。
タイトルに「憂鬱」と付けましたが、好きでやっているのでまぁパズルみたいなものです。
- ポインタレジスタが足りない
ポインタレジスタはP1
~P3
の3つしかありません。PC相対が使えるのでPCを加えても4つです。
これはHL
一つしかない8080やX
一つしかないMC6800より恵まれていると思われるかもしれません。
しかし8080もMC6800もアドレスを直接指定することができますが、SC/MPではポインタレジスタを使わないメモリの読み書きはできません。しかもポインタレジスタを退避するにも他のポインタレジスタを必要とします。 - スタックポインタがない
スタックが必要ならポインタレジスタをスタックポインタとして自分で書かなければなりません。幸いプリデクリメントやポストインクリメントとして使えるオートインデックスというアドレッシングがあるので処理は簡単ですが、貴重なポインタレジスタを一つ占有することになります。 - サブルーチンコールの仕組みがない
信じられないかもしれませんがサブルーチンコールの命令はありません。唯一使えるのがポインタレジスタとPCを交換するXPPC
命令です。私はこんなマクロを定義しました。(1) 25/ 0 : CALL MACRO addr ; CALL subroutine (1) 26/ 0 : XPAH P1 (1) 27/ 0 : ST @-1(P3) (1) 28/ 0 : LDI high(addr-1) (1) 29/ 0 : XPAH P1 (1) 30/ 0 : XPAL P1 (1) 31/ 0 : ST @-1(P3) (1) 32/ 0 : LDI low(addr-1) (1) 33/ 0 : XPAL P1 (1) 34/ 0 : XPPC P1 (1) 35/ 0 : XPAL P1 (1) 36/ 0 : LD @1(P3) (1) 37/ 0 : XPAL P1 (1) 38/ 0 : XPAH P1 (1) 39/ 0 : LD @1(P3) (1) 40/ 0 : XPAH P1 (1) 41/ 0 : ENDM (1) 42/ 0 : (1) 43/ 0 : RET MACRO ; RETurn from subroutine (1) 44/ 0 : XPPC P1 (1) 45/ 0 : ENDM
26~33で
P1
をスタックに退避しつつサブルーチンのアドレスをロードします。P3
はスタックポインタ、アドレスから1引いているのはフェッチ前にPC
がインクリメントされるという不思議な性質に対応するためです。
34でP1
とPC
が交換されサブルーチンに飛びます。戻りアドレスはP1
に入っているのでサブルーチンでは壊さないようにする必要があります。必要ならスタックに退避するなどします。
サブルーチンの終わりの44で再度P1
とPC
が交換され戻ってきます。
35~40では退避してあったP1
を復帰します。 - ジャンプ命令が遠くに飛べない
ジャンプ命令の飛び先は8ビットディスプレースメントのPC相対のみなので遠くに飛ぶことはできません。これもXPPC
命令を使うしかありませんが、飛び先を一度ポインタレジスタに入れないといけないのが厄介です。上と同様にスタックに退避してから飛ぶのですが、飛んだ先で復帰しなくてはなりません。通常のJMP
命令で飛ぶ場合と入り口を分ける必要が出てきます。
上記のようにたかがCALL
に多大なコードを要するのでジャンプ命令はすぐに届かなくなります。 - キャリを含まない加減算がない
事前にキャリを設定しておかなくてはなりません。まぁこれは6502も同様なので大したことではないです。 - 条件分岐が少ない
使える条件はACが0、ACが0でない、ACが正の3つしかありません。キャリの有無で分岐できないのは不便です。キャリフラグのあるSR(ステータスレジスタ)をACに転送することはできるので不可能ではありませんが... - 比較命令がない
上とも関係するのですがACの値でしか条件分岐できないのでACを壊さない比較命令がありません。比較のたびにACが壊れるのでswitch~case的なものを書こうとするとACの退避・復帰がわずらわしいことになります。 - シフト・ローテートが右しかない
左はADD
命令でできなくはありませんが、AC ← AC + ACのような命令は無いので一度メモリに書くかEレジスタを使うしかありません。
これまでに遭遇したものがこれくらいですかね。
現時点でオープニング表示・行入力まで動いていて、メモリダンプを実装中といった状況です。まだまだ出てくるのではないかと恐れています。楽しみにしています。
コメント
スキャンプですね
これ、8080と6800の対抗という位置付けで出てきたCPUで、面白いのが出てきたなーと思った記憶があります。SC/MPをスキャンプと読ませて、ならず者というネーミングにして、ひと癖あるけど優れものという位置付で売り出していたのを覚えています。
覚えているのは名前だけで、命令やアーキは全く知らなかったのですが、何十年ぶりに解説文を読むことが出来て良かったです。ジャンプ先アドレスが8ビット相対だけしか使えないプロセッサとか昔はありましたよね。LKit-16のCPUのMN1610もそんな感じだったかと。
Re: スキャンプですね
ちょっと動かしてみたところ「ひと癖ある」どころではない感じですね。
以前資料を読んだときには「ちょっと変わっているな」程度の認識でしたが、実際にコードを書いてみるとちょっとした処理が長くなること長くなること。マクロ多用しないとやっていられませんが、当時はハンドアセンブルしたんですよね。
MN1610もそうなんですね。MN1613を入手しているのでそのうち動かしてみようと思っています。
はじめてのCPU
この名前sc/mpⅡを見て、思わず反応しました。はじめて自作した「マイコン」です。動いてはくれましたが、「お勉強」になっただけでした。
現在67歳。青春でした。
Re: はじめてのCPU
コメントありがとうございます。
マイコン自作では「作ってみたい」という気持ちが先行して、完成したけど何に使おうか? というのはままあることのように思います。私もZ80はそうでした。
それにしても初めてがSC/MPとは、ハードウェアは素直だと思いますが、プログラム大変だったのではないですか?
コメントを追加