現在地

SC/MP使いの憂鬱


SC/MPボードUniversal Monitorの移植を始めたのですが、前にも書いたように癖が強くて大変です。

そこで移植をしていて「げっ」と思ったことを書いてみたいと思います。

タイトルに「憂鬱」と付けましたが、好きでやっているのでまぁパズルみたいなものです。
  1. ポインタレジスタが足りない
    ポインタレジスタはP1P3の3つしかありません。PC相対が使えるのでPCを加えても4つです。
    これはHL一つしかない8080やX一つしかないMC6800より恵まれていると思われるかもしれません。
    しかし8080もMC6800もアドレスを直接指定することができますが、SC/MPではポインタレジスタを使わないメモリの読み書きはできません。しかもポインタレジスタを退避するにも他のポインタレジスタを必要とします。
  2. スタックポインタがない
    スタックが必要ならポインタレジスタをスタックポインタとして自分で書かなければなりません。幸いプリデクリメントやポストインクリメントとして使えるオートインデックスというアドレッシングがあるので処理は簡単ですが、貴重なポインタレジスタを一つ占有することになります。
  3. サブルーチンコールの仕組みがない
    信じられないかもしれませんがサブルーチンコールの命令はありません。唯一使えるのがポインタレジスタと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でP1PCが交換されサブルーチンに飛びます。戻りアドレスはP1に入っているのでサブルーチンでは壊さないようにする必要があります。必要ならスタックに退避するなどします。
    サブルーチンの終わりの44で再度P1PCが交換され戻ってきます。
    35~40では退避してあったP1を復帰します。

  4. ジャンプ命令が遠くに飛べない
    ジャンプ命令の飛び先は8ビットディスプレースメントのPC相対のみなので遠くに飛ぶことはできません。これもXPPC命令を使うしかありませんが、飛び先を一度ポインタレジスタに入れないといけないのが厄介です。上と同様にスタックに退避してから飛ぶのですが、飛んだ先で復帰しなくてはなりません。通常のJMP命令で飛ぶ場合と入り口を分ける必要が出てきます。
    上記のようにたかがCALLに多大なコードを要するのでジャンプ命令はすぐに届かなくなります。
  5. キャリを含まない加減算がない
    事前にキャリを設定しておかなくてはなりません。まぁこれは6502も同様なので大したことではないです。
  6. 条件分岐が少ない
    使える条件はACが0、ACが0でない、ACが正の3つしかありません。キャリの有無で分岐できないのは不便です。キャリフラグのあるSR(ステータスレジスタ)をACに転送することはできるので不可能ではありませんが...
  7. 比較命令がない
    上とも関係するのですがACの値でしか条件分岐できないのでACを壊さない比較命令がありません。比較のたびにACが壊れるのでswitch~case的なものを書こうとするとACの退避・復帰がわずらわしいことになります。
  8. シフト・ローテートが右しかない
    左はADD命令でできなくはありませんが、AC ← AC + ACのような命令は無いので一度メモリに書くかEレジスタを使うしかありません。

これまでに遭遇したものがこれくらいですかね。

現時点でオープニング表示・行入力まで動いていて、メモリダンプを実装中といった状況です。まだまだ出てくるのではないかと恐れています。楽しみにしています。


コメント

これ、8080と6800の対抗という位置付けで出てきたCPUで、面白いのが出てきたなーと思った記憶があります。SC/MPをスキャンプと読ませて、ならず者というネーミングにして、ひと癖あるけど優れものという位置付で売り出していたのを覚えています。

覚えているのは名前だけで、命令やアーキは全く知らなかったのですが、何十年ぶりに解説文を読むことが出来て良かったです。ジャンプ先アドレスが8ビット相対だけしか使えないプロセッサとか昔はありましたよね。LKit-16のCPUのMN1610もそんな感じだったかと。

ちょっと動かしてみたところ「ひと癖ある」どころではない感じですね。

以前資料を読んだときには「ちょっと変わっているな」程度の認識でしたが、実際にコードを書いてみるとちょっとした処理が長くなること長くなること。マクロ多用しないとやっていられませんが、当時はハンドアセンブルしたんですよね。

MN1610もそうなんですね。MN1613を入手しているのでそのうち動かしてみようと思っています。