筆者の気持ちとは別に,授業はどんどん先に進む。次はいよいよ,実習用のCPUボードを活用する。ボード上にある7セグメントLEDを制御するプログラムを作成するという。LEDという外部の機器にデータを入出力しなくてはならなくなるので,ここではじめてI/Oの出番。そこでI/Oへのデータ転送について説明を受ける。

 I/Oは,外部の機器とデータのやり取りを行うことから“ポート”と呼ばれるが,実際には外部機器との接続するための端子がマイコンに設けられている。この端子は,入力モード,出力モードの設定が自由に行える回路設計になっている。このため,プログラム上ではポートが入力モードなのか出力モードなのかを設定する。実際にはMOV命令などを利用して、各々のポートのモードを設定するビットに1を設定すれば入力、0を設定すれば出力となる。

 ポートとデータをやり取りするためには,メモリと同様のデータ移動となる。やはりMOV命令を利用する。例えば,ポート15のデータをAレジスタに転送,すなわちデータ入力するには,
  MOV A, P15
となるし,またAレジスタのデータをポート15に転送,すなわちデータ出力するには,
  MOV P15, A
となる。

LEDの制御にチャレンジ

 ここまで学んだ後で,実際にLEDの制御を行う例題が与えられる。例題は以下の通り。

(1)7セグメントLEDの制御
ポートを制御して,7セグメントLEDの1桁目(7SEG4)に“0”~“F”までの16進数を表示しなさい。ただし,16進数の値はポート15から入力すること

 ポート15には入力用のスイッチが接続されているが,このうちの四つのスイッチの切り替えによってLEDに表示する数を変更させようというものだ。はっきり言ってどのようにコードを書くのか想像も付かない。

 講師による回答は図3に示す通り(プログラムの高解像度の画像データを開く場合はこちら)。

図3●7セグメントLEDの制御プログラム(1)

 ここで,新たに“疑似命令”という言葉が登場する。この疑似命令とは,アセンブリ言語が直接機械語に変換されるのに対し,その変換処理を行うソフトウエア(アセンブラ)に指令を行うという。半分分かったようで分からないような説明だが,とにかくプログラムの記述を容易にしてもらえるものとここでは理解。

 ここで,使用する疑似命令は,シンボル定義疑似命令であるEQU。これは,プログラムを記述する際に使用するデータにネーム(名前)を割り付ける際に活用する疑似命令。プログラム中でデータの意味がはっきりするので,内容が分かりやすくなる。具体的に今回のプログラムでは,0~Fまでの文字を表示するのに7個のLEDの内,どれを光らせればよいかを設定するのに利用している(プログラムの冒頭,SEG7_0から始まる部分)。

 次にメインのプログラムに移るが,はっきり言ってここからは息も絶え絶えだ。というのも,新しい命令が次々と出てくるために,その命令が何を意味するのかを教材にある一覧から確認しながら,プログラムを追わなくてはならないからだ。解答では,ネームを割り付けた後に,いきなり「SET1」や「CLR1」というニモニックが登場する(プログラムINIT以降)。これらも命令として初めて出てくるので,一覧で調べなくてはならない。

 二つはいずれもビット操作の命令群。前者は指定したビットに1を,後者は指定したビットに0をセットする命令である。これによって,ハードウエア上では四つある7セグメントLEDの一桁目(P0.0に設定されている)が選択され,さらにそれは出力モードに設定されたことになる。

 しかし,短い授業の間ではそれを理解するにはいたらない。このあたりから一気に落ちこぼれモードに突入。その後に続く,MOV命令で続く4行も理解が及ばない(参考までに続く2行で選択した7セグメントLEDに消灯データを出力し,さらに続く2行でポート15に設定されたスイッチの下位4ビット分を選択している)。授業が進んでいるために,質問することもできず,自分でぱらぱら教材をいったりきたりがはじまる。

 ここまでが実行前の初期状態で,続いてメインのプログラム(プログラムMAIN以降)。まずスイッチの情報を取得することから始まる。そして,以降は一見,同じようなプログラムを繰り返す。
CHK_SW_INFO_0:
  CMP A, #00H
  BNZ CHK_SW_INFO_1
  MOV P2, #SEG7_0
  BR MAIN

 ここでは,取得したスイッチの情報を,まず“0”を表示する時のスイッチ情報と比較(ニモニックとしてCMPを利用)。分岐命令(ニモニックにBNZを利用)によって両者が一致すればゼロを表示するし,一致しなければ今度は“1”を表示する時のスイッチ情報と比較する。これを繰り返すことで,いずれかの数字をLEDに表示する。

 このように,現在記事を書くにあたってじっくりと教材を読むと,それぞれのコードで何をしているかが理解できる。しかし,当日は部分的にしか分からずに,必死に全体像を把握することに専念する。(次のページへ