2020-10-24 23:56 — asano
カテゴリー:
前回は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
命令はアブソリュートアドレッシングが使えません。
もう一点の問題はレジスタが少ないので機能コードをどうするかです。- Xレジスタを使う方法。ゼロページX間接アドレッシングを使ってジャンプテーブルが容易に実現できるのがメリットですが、これはポインタを引数として渡すときにも使いたいし、貴重なゼロページをジャンプテーブルなどに消費するのは勿体無い気もします。
- Yレジスタを使う方法。
- ゼロページなどメモリに書いておく方法。
- スタックに積んでおく方法。
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なんて組み込み以外ではほとんど使われていないだろうし...
コメントを追加