CCMBは(そのスーパーセットであるCMBもですが)、次のようにきわめてアクセス頻度の高いインタプリタ用のグローバル変数を常時レジスタに割り当てています。Cなどのコンパイラで作るとこのような「グローバル変数を常時レジスタに割り付ける」なんてことはやってくれないと思います。
|
|
|
R11 |
LINEP |
現在実行中の行の先頭を指すポインタ |
R12 |
EXEP |
現在まさに解釈・実行中の文字を指すポインタ |
R13 |
|
2バイト、4バイトの即値ロード用 |
R14 |
|
構文チェック用ソフトウエアスタックポインタ |
私はこれまで、Z80、80x86リアルモード、H8のBASICを作ってきましたが、SHになって汎用レジスタが15個になって急に自由度が増したように感じました(H8はERnを1個の汎用レジスタと考えると結局7個で、8086等と比べてあまり増えた感じはしませんでした)。それらのCPUではLINEP、EXEPのレジスタへの常時割り当ては行っていません。H8版では、ソフトウエアスタックポインタのみER6に常時割り付けしています。 |
必ずしも100%のっとっていないところもありますが、大体次のようなルールで名前をつけていますので、覚えておくと概要がつかみやすくなります。
● Qで始まるラベル名のルーチンは「□△であるか否か」を判定し、□△であると判断すればSRのTビットをセットしてリターン、そうでなければTビットをクリヤしてリターンする。
なお、私はサブルーチンの戻り値が真か偽か、あるいは成功か失敗かといったブール値の場合、SRのTビットで返す、という手法を多用しています。これだとたった1ビットの情報のために貴重な汎用レジスタを1つ潰す必要がありませんし、受け取った側は即条件分岐できます。(これもZ80版ではキャリーフラグで渡していた名残)) |