You are here

[UniMon] 内部ルーチンの新しい呼び方を試す(その2)


カテゴリー:

前回は8080とZ80への実装について書きました。他のプロセッサへの展開についてとりあえず思いつくところを書いてみます。

  • 6800
    SWI命令はブレーク用に使ってしまったのでJSR命令を使うしかありません。ブレークは1バイト命令でないと使いにくいでしょうから。
    機能コードは... Bレジスタかなぁ。
  • 6809
    SWI命令をブレーク用に使ってしまったのは6800と同様ですが、SWI2命令, SWI3命令があるのでどちらかを使うことになるでしょう。自動的に全てのレジスタを退避するSWI命令はブレークに適しています。
    これも機能コードはBで良さそうです。
  • Z8
    Z80と異なりRST命令は無いのでCALL命令を使うしかありません。アドレスをどこにするかは検討が必要です。
    レジスタも対等なものが多くありますので悩まなくて良さそうです。
  • 6502
    6800と同様にBRK命令はブレーク用に使ってしまったのでJSR命令を使うしかありません。間接アドレッシングが使えれば$FFF8あたりにアドレスを書いておいて3バイトのソフトウェア割り込みっぽくする手も考えられるのですが、残念ながらJSR命令はアブソリュートアドレッシングが使えません。
    もう一点の問題はレジスタが少ないので機能コードをどうするかです。
    1. Xレジスタを使う方法。ゼロページX間接アドレッシングを使ってジャンプテーブルが容易に実現できるのがメリットですが、これはポインタを引数として渡すときにも使いたいし、貴重なゼロページをジャンプテーブルなどに消費するのは勿体無い気もします。
    2. Yレジスタを使う方法。
    3. ゼロページなどメモリに書いておく方法。
    4. スタックに積んでおく方法。
    5. JSR命令の直後に置く方法

    4., 5.はスタック操作が6502では面倒かも。ユーザプログラムから見ると5.が楽で、次が1., 2.かな。

  • SC/MP
    こいつはソフトウェア割り込みどころかサブルーチン呼出し命令すらないのでXPPC命令を使うしかありません。
    機能コードはEレジスタがインデックスアドレッシングが使えて良さそうです。
  • TLCS-90
    Z80によく似ていますがRST命令はありません。SWIはありますが、これはブレーク用に残しておきたい気がします。
    レジスタ構成はZ80と同じなので機能コードはCレジスタのままで良いでしょう。
  • MN1610
    サブルーチン呼び出しに相当する命令はBAL命令しかないのでこれを使うしかありません。問題は呼び先アドレスの指定で8ビットしか使えないことです。IC相対間接でも良いのですが、0ページのどこかにアドレスを書いておくのが良さそうです。ユーザプログラムは0ページ内のアドレスだけ知っていればすみます。
  • TMS9900
    XOPというソフトウェア割り込み命令がありますので、これを使うのが良さそうです。ベクタも16通りあるのでブレーク用と共存も問題ありません。
    さらに16ビットのパラメータ(イミディエートを含むアドレッシングモードが使用可能)が渡せるので機能コードに使えそうです。
  • 8086
    MS-DOSのシステムコールやPC-9801のBIOSに似せて、AHレジスタに機能コードを入れてINT命令というのが良さそうです。何しろ十分すぎる実績がありますからね。
  • 8051
    機能コードをBレジスタに入れてLCALL命令かな。

既存のOSなどで使われている方法がわかれば参考になるのでしょうが、8086以外は難しそうですね。
Z8, TLCS-90, 8051なんて組み込み以外ではほとんど使われていないだろうし...


Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。