2021-10-03 23:24 — asano
カテゴリー:
前回μCOM-87/ADファミリの命令についてグループを書きましたが、詳しく見てみると結構複雑な状況でした。
まずはプロセッサのグループ分け、このグループ自体は前回のものであっています。
- μPD7800~μPD7802
このグループの命令コードの公式な資料を発見できていません。データブックに命令表自体は載っているのですが何故かオペコードの記載がありません。
リンクに挙げた「eSCV 謎WIPページ」のコード表を参考にしています。 - μPD78C05, μPD78C06
これもデータブックにはオペコードが見当たらなかったのですが、”μPD78C06 μPD78C06A Product Description” と "μCOM-87 Series SE-78C06 User's Manual"(開発ツールのマニュアル)にオペコードの記載がありました。 - μPD7807~μPD7809
1983/1984年版のデータブックはPreliminary扱いで概要しかありませんが、1987年版にはオペコードまで記載があります。 - μPD7810, μPD7811
こいつは曲者で1983/1984年版のデータブックに記載があるのですが、そこに掲載の命令表がどうもμPD7807 ~ μPD7809のもののようなのです。μPD7807系とμPD7810系では異なる命令があるらしいという事前情報があって比較していたら一致してしまって...
1987年版のデータブックのものが正解と思われます。 - μPD78C10~μPD78C12, μPD78C14
1987年版・1990年版のデータブックにオペコード含めて記載があります。
当初、B.はA.から一部の命令を省いたもの、C.はA.に命令を追加したもの、D.はA.にC.とは異なる命令を追加したもの、E.はD.に命令を追加したものと思っていました。
ところが(まだA.,B.のオペコード資料を発見する前に)A.,B.とC.,D.,E.で命令は共通なのにその命令長の異なるものがあることに気づきました。例えばDI
(割り込み禁止)命令はC.~E.では1バイト命令なのにA.,B.では2バイト命令になっています。
データブックには前述の大きな誤り以外にも抜けや誤りが散見されるのでこれも間違いなら良いのですが、事実とするとちょっと困ったことになります。
アセンブラとしてはいつものThe Macroassembler ASを予定していますが、これはμPD78(C)0x, μPD78(C)1xをサポートすることになっていますがCPUの切り替えは「7810」「78C10」しかありません。どうせμPD7807系は持っていないのでD.,E.で追加された命令を避ければμPD7800Gにも使えるだろうと思っていたのがひっくり返ってしまいます。
Universal Monitorもソースは共通にできるにしても、バイナリは別個に用意しなくてはならないかもしれません。
ということで資料を探して比べたところ確かに異なっていることがわかりました。
ASの件はμPD7800Gに着手(前回書いたようにソケットの問題があるので当面は...)するまでに自分で修正するか。作者に報告したら直してくれるかな。
モニタのバイナリは別にするしかなさそうです。何せRET
命令のコードから異なるのでどうしようもありません。
それにしても何でこんな大胆な変更をしたのでしょう?
以下、私の想像を書いてみます。
大きな理由は16ビット対応でレジスタが増えたことです。
例えばレジスタの転送命令MOV A,r1
を考えます。r1のところには転送元のレジスタB,C,D,E,H,Lのいずれかが入ります。μPD7807以降では16ビット化で追加されたEAの上位EAHと下位EALも転送元として追加したくなります。
さてこの命令のオペコードは2進で0 0 0 0 1 T T T
で、TTTの部分で転送元を指定します。
μPD7800ではこのTTTは010~111が使用されていたので000,001は未使用でした。この未使用の000に相当する00001000(16進で08)をRET
命令として利用していました。
μPD7807以降では転送元レジスタが2つ増えたので000,001もMOV A,r1
命令に必要になりRET
命令を移動することになったのです。
これの移動先として目を付けられたのがベクタによるサブルーチン呼び出しのCALT word
命令です。これは1バイト命令でオペコードは2進で1 0 T T T T T T
、TTTTTTの部分でベクタを指定します。
これ16進で80~BFまでの64個を占有しています。
さすがにこれは多すぎだろうと1 0 0 T T T T T
に変更して、捻出したA0~BFに先述のRET
命令などを再割り当てしました。ついでにPUSH rp1
, POP rp1
, EI
, DI
なども1バイト命令に格上げされました。
どうせ48, 60, 70などのプリフィックス付きのコードはあり余っているのでそっちに割り当てればとも思いますが、組み込み専用でバイナリ互換の必要は無いとの判断だったのでしょうね。
コメント
uPD7800/1/2 の命令セット
一応手元の NEC 「シングル・チップ(8ビット) 1983」には記載があるようです。78C05/06 も載っています。
#手元に京都マイコン? の 78C10 SBC があるので、このシリーズ作るのは消極的だったりします。
Re: uPD7800/1/2 の命令セット
日本語版にはオペコードの記載あるんですね。
オペコード以外はデータブックに記載あるので何とかなりそうです。
コメントを追加