ズッキーニの味噌煮込みBlog版

コンピュータのこと、食べ物のこと、なんでもないこと、とんでもないこと。

割り込みが動いた

2005年05月02日 16時35分35秒 | Kちゃん日記
 今朝から半日かかって、こないだ買ったTK-78K0/KF1+(UPD78F0148H)ボードで割り込み処理を記述していた。やっと動いたところに歯医者から帰ってきた嫁さんと昼飯を食いに行き、ついでに買い物をしていま戻ってきたところだ。

 Z-80のアセンブラでゴリゴリと書いていたのはもう20年以上前のことで、しかもワンボードマイコンの時代より少し進んでMZ-80やPC-8001が大活躍のころだ。ボードの初期化や割り込みを書くのは初めてとは言わないが、まれなことだった。

 最初に書いたのは以下の3ステップだった。

 MOV  A, #0C0H
 MOV  P5, A
 HALT

 これだけで、ボード上の7SegLEDに数字の'0'が表示される。もちろん回路がそうなっているからで、VRAMにキャラクタコードを書き込むと文字が表示されるのと理屈はおなじだ(当然だが後者の方がずっと複雑な回路になっている)。

 このままベタに書いていくと収拾がつかなくなるので、Aレジスタに数値を入れて呼び出すとその数値に対応した数字(ひと桁だが)が表示されるようなサブルーチンを仕立て上げ、その部分はあとで使えそうなのでソースファイルを分け、初期化も独立したサブルーチンにして、それらを呼び出すためにスタックを設定し…という下準備が終わったのが昨日の深夜。

 今朝からハードウェアマニュアルと回路図とインストラクションセットを周りに広げて、メーカ提供の数少ないサンプルプログラムの助けも借りながら、ひとつひとつていねいにコードを積み重ねていった。

 サンプルをそのまま、あるいは流用すれば動き出すのは早いのだが、メーカ提供のサンプルはよけいなコードが混入していることが多く、そのまま使うとあとで首をかしげることになる。時間はかかってもひとつひとつの命令を自分が納得して記述していかなければならないと信じている。

※ サンプルコードを意味もよくわからずにつまみ込んで、ちょこちょこと手を入れてプログラムを書いた気になっている輩は、エンジニアではなく「チェンジニア」と呼ぶ。

 最初の3ステップのプログラムはただ7SegLEDに'0'を表示するだけだったが、できあがったプログラムは最初に7SegLEDの表示をクリアし、ボード上のスイッチを押して離したタイミングで数字の'0'が表示されるようになった。スイッチ(SW3)が割り込み(INTP1)を発生させる回路になっていることを利用したものだ。

 まずはフラグをクリアして、そのフラグがセットされるまで回り続ける無限ループを書く。SW3の立ち上がりエッジで割り込みを発生させ、割り込み処理ルーチンの中でフラグを立てると無限ループを抜けてくる。その下に'0'を表示させる処理が書いてあるというストーリーだ。

 一番大きな失敗は、初期化ルーチンの最後にRETを書くのを忘れたことだ。その真下に割り込み処理ルーチンがあるので、初期化が終わるとそこに飛び込んでしまう。「なんで割り込み許可フラグを立てる前に割り込みが発生しているのだ?」と不思議でならなかったが、アタシが悪かった。^_^;

 そのほかにも、EI/DI切り替えのタイミングを間違えたり、割り込み許可フラグとエッジ検出フラグのビット位置が違うので混乱してマスクパターンを作り間違えたりと、間抜けなことを結構やった。

 とりあえず動いたので、今度はタイマ割り込みを使ってみようと思っている。割り込みを制するものはボードを制するのだ…って、誰かそんなこと言ったっけ?

 あ、そうそう。TK-78K0/KF1+では呼びにくいので、「Kちゃん」と呼ぶことにした。ついでにこれに関連した投稿を「Kちゃん日記」というカテゴリに入れることにした。このブログはサブカテゴリが作れないようなので仕方がないが、本来は「コンピュータ」カテゴリのサブカテゴリにすべきものだろう。