GMC-4 の永字八法

永字八法とは書道の言葉で、漢字の「永」の字には、書に必要な技法8種が全て含まれているということを表している。永という一字に書道の技法が凝縮されているというのが面白い。

学研の4ビットマイコンGMC-4 のプログラムも永字八法のように短いプログラムで必要な技法を詰め込めないか考えてみた。GMC-4は、入力はキー入力だけ、出力は2進のLEDと7セグメントLED、それに、スピーカーからの電子音だけ、分岐は条件ジャンプのみなど小さな仕様だが、それでも、いざ、プログラムしようとすると結構頭をひねることが多い。暗記できるような短いプログラムでそれらの基本的な技法が習得できれば便利だ。

その1 キー入力プログラム

16進キーボードをスキャンしてその値を7セグメントLEDに表示するプログラムだ。

キー入力の時にビープ音を鳴らすようにしている。技法としては、キー入力サブルーチンの呼び出し、キー入力を待つループを作る。キー入力された時にビープ音を鳴らす。キー入力されたAレジスタの内容を7セグメントLEDに表示する。無限ループを作るなどが含まれているが、全部で10ニブルしか使っていない。

下の表記は、アドレス、機械語、ニーモニック、説明の順になる。

00 0 KA #押された数字キーの値をAレジスタに入れる。キーが押されていないときは実行フラグは1。
01 F 0 0 JUMP 0 0 #キー入力されるまで待つループを作る。実行フラグ1のときのみの条件ジャンプ。
04 1 AO #Aレジスタの値を数字LEDに表示する。
06 E9 CAL SHTS #「ピッ」という短い音を鳴らす。実行フラグ1
07 F 0 0 JUMP 0 0 #最初に戻るループ。上のステップの実効フラグが1だから無限ループになる。

その2 2進LEDを次々に光らせる。

2進LEDを光らせるプログラム。

2進LEDの特定の場所を光らせる、タイマーを使う、レジスターの演算をする、条件分岐を使う、エンド音を鳴らす。停止命令を実現するなどの技法が盛り込まれている。

00 A 0 TIY #Yレジスタに数値0を代入する。
02 E 1 CAL SETR #2進LEDの1か所をYレジスタの値の位置で光らせる。
04 8 4 TIA #Aレジスタに待ち時間の設定値4を代入する。
06 E C CAL TIMER #Aレジスタで指定した時間だけ待つ。
08 B 1 AIY #Yレジスタの値に1を足す。
0A D 7 CIY #Yレジスタの値が7なら実行フラグが1になる。それ以外は実行フラグは0。
0C F 0 2 JUMP 0 2 #Yレジスタの値が7になるまではアドレス02からの処理を繰り返す。
0F E 7 CAL END #エンド音を鳴らす。実行フラグは1。
11 F 1 1 JUMP 1 1 #この位置で無限ループを作る。GMC-4には停止命令がないのでこれで代用する。

これらの二つのプログラムを空で入力できるようになれば、GMC-4を使うコツがわかる。


GMC-4 でプログラムするときの注意点

1) 停止(HALT) 命令がないので停止するときはその場所で無限ループを作る。


00 E 7 CAL ENDS #エンド音を鳴らす。
02 F 0 2 JUMP 0 2 #無限ループで停止命令の代わりをする。

2) JUMP命令は条件ジャンプなので、実効フラグが1でないと実行してくれない。

JUMPは条件ジャンプなので実行フラグが1でないとジャンプしない。Aレジスターに数値を足すAIAなどの命令は、桁上がりがないと実行フラグが0になるのでその後に書いたジャンプ命令は実行されず素通りしてしまう。


00 8 0 TIA 0 #Aレジスタの値を0にセット。
02 1 AO #Aレジスタの値を数値LEDに表示。
03 9 1 AIA 1 #Aレジスタの値に1を足す。
05 F 0 2 #無限ループにしたつもり。実際は実行フラグが上のステップで0になっているのでジャンプしない。
08 E 8 CAL ERRS #エラー音を流す。
0A F 0 A JUMP 0 A #上の命令では実行フラグが1になるので、この無限ループは有効になる。

実行フラグが0になるような命令を使った後ジャンプするときは、次のように実行フラグが1になるダミーの命令を使わなければならない。

00 8 0 TIA 0 #Aレジスタに数値LEDに表示する値を入れる。
02 1 AO #Aレジスタの内容を数値LEDに表示する。
03 2 CH #Aレジスタを裏レジスタに退避(基本技法)。
04 8 4 TIA 4 #Aレジスタにタイマーの待ち時間を設定。
06 E C CAL TIMR #タイマーを呼ぶ。
08 2 CH #退避していた裏レジスタの値をAレジスタに呼び戻す。
09 9 1 AIA 1 #Aレジスタの値に1を足す。実行フラグが0になるので問題の個所。
0B 2 CH #Aレジスタを退避するダミーの命令。実行フラグが1になる。
0C 2 CH #退避したAレジスタを元に戻す。退避して元に戻すから何もしていない。フラグをセットしただけ。
0D F 0 2 JUMP 0 2 #これで無限ループが実現できた。
[PR]
by tnomura9 | 2009-07-12 02:12 | 話のネタ | Comments(0)
<< GMC-4 でサブルーチンを使う 4ビットワンボードマイコンGMC-4 >>