PR

 約3カ月に渡って紹介してきた「マイコンなんてこわくない」もいよいよ最終回(このような企画に至った経緯はこちら。別ウインドウが立ち上がります)。自作したプリント基板から音を出すべく,プログラムの作成に着手。果たして,最後はハッピーエンドで終えることができるのか・・・・・。

 元技術者だった同僚の指示により,プログラムを作るに当たってフローチャートを作成した。フローチャートの作成はそこそこ苦労。しかし,苦労した分,このフローチャートに従って実際のコードを書いていけば,ひょっとすると簡単に音が出るかもしれない。

苦労して作成したフローチャート
苦労して作成したフローチャート (画像のクリックで拡大)

 まずは,どのボタンが押されているかどうかをチェックするプログラムから。基本的には四つの出力ポートのどれか一つをHighの状態にして,三つの入力ポートがHighになっているかどうかを順番に調べていく。Highになっていれば,ボタンが押されていることになるのだが,誤って二つのボタンが押されていることも,想定しなくてはならない。そこで,ボタンが押されていることが認識された時点でAレジスタに1を挿入。レジスタが2以上,すなわち二つ以上のボタンが押されていれば最初に戻る。そして,エラーでなければ,音を出すプログラムで使えるように,その音に応じた位置のメモリにフラグをたてておく。このような処理を繰り返していく。
 
 続いて,音を出すプログラム。まずメモリのどこにフラグがたっているかをチェック。フラグがたっているならば,レジスタに周波数を設定した上でスピーカから音を出す。ただし,同じボタンがずっと押されているならば,再度周波数を設定し直す必要がないので,再度ボタンをチェックするプログラムに移動する処理を設定。

 このような基本的な処理のほかに,データをクリアする部分を加えたり,プログラムの開始位置を決めたりといった部分の記述を追加。とりあえず,一通り完成したプログラムは以下のようになった(プログラムの高解像度の画像データを開く場合はこちら)。

●一通り記述したプログラム

 さあ,これでいよいよ"ビルト"によって,実行ファイルを作成する段階に突入する。すんなりいけば,実際の基板を使ってのデバッグ処理ができるはず。勢い込んでメニューの中からビルトを選択,そして実行。すると,あらあら赤い文字の行が次から次へと出現,あっという間に数百表示される。その数,"488"。要はビルトの段階で488個のエラーが検出されたのだ。そんなにうまくいくはずもないと思ってはいたものの,その数には正直圧倒される。

エラーで画面が真っ赤になる
エラーで画面が真っ赤になる (画像のクリックで拡大)

 ただし,見ての通りプログラム部分には繰り返しが多い。このため,一つ問題をつぶせば,エラーの数も複数個ずつ消えていく。どうにかなるはず,と自分を元気づけエラーの文字をながめる。赤い文字にはどこの行でどのような内容のエラーが出ているかが記述してある(「Syntax error」「Illegal operand」「Undefined symbol reference」「Operand out of range (byte)」など)ため,どんな点が怪しいのかのヒントとなる。

 これを分析することで,例えばショート・ダイレクト・アドレッシングを指定するときには最初に0を加える,専用レジスタはビットを指定した上でSET1やCLR1を使ってフォーマットする,ショート・ダイレクト・アドレッシングをクリアしたければ"#00h"を代入するなどで問題をクリア。一つの問題をクリアすれば,数十の単位でエラーが消えていくのであっという間にエラーの数は20個以下となる。

分岐命令に落とし穴

 しかし,最後のツメが厄介だ。残った問題はいずれも条件付き分岐命令の行で起きていた。問題となっている箇所の一つは,各スイッチが押されているかどうかを調べるためのプログラムの中で,二つ以上のスイッチが押されていたら(Aレジスタが1ではなかったら)最初に戻りなさいと記述した部分である「BNZ $CHK_CMP_REG」。もう一つは,音を出すプログラムの中で,スイッチがずっと押されているならコンペア・レジスタを書き換えずにもう一度スイッチチェックに戻りなさいと記述した部分である「BZ $CHK_PSH_SW_01」。しかも,同じようなプログラムを繰り返しているにも関わらず,前者のエラーは途中のスイッチチェックの処理から出現している。

 ここで,セミナーの教科書をもう一度熟読。すると,条件付き分岐命令には飛ばせる範囲に制限があるよう。要はプログラムがだらだらと長いために,条件付き分岐命令では前に戻りきらないようなのだ。確かに力ずくのプログラムで美しくないのは,自分でも十分に承知している。サブルーチンは習ってはいるものの,ここからサブルーチンを使ってプログラムを改良しようとなると,かなりハードルが高いような気がする。(次のページへ