Stage.01解説:杉之原名人うぁけましておめでとうございます。皆さんのマイコンの調子はどうですか?それから浅田さん、結婚のご予定は?(注:'05現在結婚12年目・・・いや、どうでもいいんですけどね・・・)ところで、スタックポインタを使用したプログラムを突然にも紹介します。SP-5030で使われていたものをさらに改良したものです。HLレジスタの内容をテキスト画面上のアドレスDEから、左詰め十進数で表示するものです。リターン以上がそのプログラムです。長いものですが、スタックポインタ(SP)を利用するといろいろと面白いプログラムができるものです。Aとして、キャリーフラグを0にしている。Bレジスタはゼロブランキング用のフラグとして使用されている。●27行目付近のループで各桁の十進値を計算している。除算命令があれば一発で求められるのだが、残念ながら乗除算命令の無いZ-80では減算を繰り返して求めている。6バイトのループだが、最悪10回も繰り返すとなるとバカにならない。Z-80のALU(演算回路)は4ビット長しかないので、このループ内の16ビット減算にはなんと19ステートもかかる。Z-80用のアルゴリズムとしてはよくできていると思われる。このループのこれ以上の最適化は不可能か?と問われると実はそうではない。24行目以降を次のように変更する。A"が不要となり、1ループあたり4ステート分高速化する。25行目の直値ロード命令も3ステート高速化し、サイズも1バイト小さくなる。変更された26・31・35行目もステート数・サイズとも変わらないので、全体として確実に小さく、速くなっているというわけである。念のため解説しておくと、キャリーフラグの変化しないINC命令に変えてADD命令を使うことにより、Aレジスタのインクリメントと同時にキャリーフラグを降ろしているというわけ。演算の結果Aレジスタの値が9を超えることがないので、常にキャリーフラグは0となる。これらはCレジスタが空いていることを利用している。●40~43行目で、スタックに積んであった表示アドレスをHLレジスタに入れ、そこへASCIIコード化した数値を書き込み、表示位置を更新してからスタックに戻している。ここが本プログラムのアピールポイントである。組み込みを前提としたROM化を睨んだ手法であるといえる。16ビットCPUでは当たり前になっている「スタックフレーム」をZ-80でやってみました・・・というところか。ちなみにZ-80には16ビットレジスタ間の転送命令がないので、IXやIYを作業用記憶域として利用するメリットがない。することによってプログラムサイズも小さくなり、実行速度も上がる(先の最適化を行わない場合)。言うなら、十の桁を求めるときはサブルーチン"SUB"を使うのではなく、専用のコードを使えばグンと速くなる。十の桁は8ビットレジスタでも計算できるので19ステートかかっていた減算が4ステートで終わってしまう。若干プログラムサイズは増すだろうが、利は大きい。