Encore!機械語プログラミングはじめての方は「ごあいさつ」からご覧ください。Encore!(*1)の1つZ8F6421PM020SGの機械語プログラミングを解説します。このマイコンは日本語の技術資料が少なく、英文マニュアルが苦手の人にはとっつきが悪いのですが、所詮コンピュータ用語の羅列です。何とか慣れてしまえば、アセンブラで遊ぶ/学ぶには最適なマイコンです。(理由はコラム「色々」の「ごあいさつ」をご覧ください)ここでは、マイコンキットZCPU1/K(E)で具体的に説明しますが、メーカー純正ツール(*2)を使用する方にも参考になることと思います。私の理解不足から間違った説明をしてしまうことがあるかもしれませんが、それはご了承ください。MC(TM)の3種類(無印、XP、MC)があり、このうちのXPです。(*2)ザイログ社から直接購入か、Digi-Key(http://www.digikey.jp/)から購入可能かと思います。ハードウェア概要と開発環境(2016/10/01掲載,2016/10/22最終変更)まず最初に、プログラム開発する対象マイコン(Z8F6421PM020SG)のハードウェアの特徴を知る必要があります。このマイコンの特徴を列挙します。Encore!の全体像が理解いただけたと思います。次に参考資料ですが、次のものがあります。ここでは、参考資料が手元になくても読めるようにしていくつもりですが、実機でプログラミングする方はダウンロードをお勧めします。ファームウェアリスト抜粋)(*3)--------------------(*1)名前の通りマイコンチップに内蔵のデバッガーで、外部とのシリアル通信でROM読出/書込/消去が可能です。(*2)具体的には次のマニュアルです。ザイログ社のホームページ(http://www.zilog.com/)等からダウンロードできます。(PS0199)(*3)具体的には次のマニュアルです。(2016年10月時点)本ホームページの「関連文書」からダウンロードできます。電源投入からのプログラム実行まで(2016/10/09掲載,2016/10/22最終変更)第1回で触れましたが、このマイコンは電源投入後、内蔵ROMの2~3番地に「書かれたベクタアドレス」のプログラムから実行します。(*1)今回は、この電源投入後マイコンを正しく動作させるために必要なプログラムを見てみます。プログラム例としてキットのファームウェアリストを使います。本当は長いリストなのですが、ここでは説明に不要な部分を省略して表記しています。Lリスト2-1では、EQU疑似命令でマイコン内蔵レジスタのアドレスにラベル(名前)を割り当てています。これにより内蔵レジスタをアドレスではなく名前で呼ぶことができ、プログラムは格段に見やすくなります。ラベルは何でも構わないのですが、メーカーで決めたれレジスタ名を使った方が便利です。(*3)なお、本アセンブラ特有のルールなのですがラベル先頭にはコロン(:)を付けます。リストを見ると左側のアドレス、データ部分が空白になっています。これは単なるラベルに数値を割り当てているだけで、アセンブラがコードを生成しないからです。次にリスト2-2を見てみます。(非公開)システムスタートリスト2-2の1行目にORG疑似命令があります。これは、指定番地からコード展開することをアセンブラに指示しています。ここでは%0000なので、0番地を指定しています。(%は16進数を意味します)3、4行目ではDB疑似命令で0番地のデータをEFH、1番地のデータをFFHとしています。データが0番地以降に展開されたのは、先程のORG命令で0番地を指定したためです。本マイコンの0番地と1番地はオプションビットといって、マイコンの動作モードを規定する特殊なROMエリアです。結論を言うと、本キットでは4MHzのセラミック振動子を使っているため0番地のデータをEFHにしています。(*4)次の6、7行目ではDB疑似命令で2番地のデータを00H、3番地のデータを38Hとします。このデータは基本的には自由な値を書いてかまいません。マイコンは電源投入後、ROMの2~3番地に書かれたアドレス(ベクターアドレスと呼ぶ)からプログラムを実行します。このプログラムの場合、マイコンが最初に実行する機械語プログラムは38H番地に書かれた機械語ということになります。38H番地を見て見ましょう。リストでは途中省略していますが最後の行(0038H番地)にJP(ジャンプ)命令があります。マイコンは最初にこのJP命令を実行することになります(*5)。:START)の機械語です。次回は、START以降のプログラムを見ていくことにします。--------------------(*1)2~3番地に書かれたプログラムから実行ではないことに注意してください。マイコン内蔵ROMは、マイコンメーカーから消去状態(データFFH)で出荷されています。(一部CPU情報エリアは例外)キットZCPU1/K(E)のマイコン内蔵ROMに書き込まれているプログラムは、後から書き込んだものです。(*3)メーカー純正ツーの場合、ヘッダファイルとして提供されているかも知れません。Bits)を見てください。(*5)せっかく、38番地から実行できるのに、わざわざ別の番地(START)へジャンプさせるのは本キットの都合です。プログラム実行で最初に行うこと(2016/10/22掲載,2016/11/05最終変更)前回は、マイコンの電源が投入されてから最初の命令を実行するまでのプログラムを説明しました。このプログラムをマイコンのROMに書き込んで電源投入すれば、マイコンは最初の命令を正しく実行します。この時点ではマイコン内部のレジスタやマイコンの各ピンの機能はマイコンチップ内部のハードウェアで決められた初期状態になっています。)を行わせるためには、この初期状態を適切な状態に変更(初期設定)する必要があります。今回はこの初期設定について説明します。プログラム例としてキットのファームウェアの初期設定を見てみましょう。Interrupts)命令で割込禁止にしています。本キットのファームウェアでは割込を使用していないのでこのようにしています。Interrupts)命令で割込を許可することが可能です。Pointer)命令があります。Pointer)を00Hとしています。RP=00Hとしたので、r0~r15は000H~00FH番地に割り当てられることになります。4~5行目では、サブルーチンや割込で使用するスタックポインタを設定しています。ここでは100H番地に設定しているので、100H番地"未満"のFFH,FEH,FDH...番地のRAMがスタックエリアに使用されます。どこまで使用されるかはプログラムによって決まります。6~7行目では、シリアル通信の通信速度を設定しています。通信速度はマイコンのクロック(4MHz)をどの程度分周するかで決まります。ここでは9600bpsに設定しています。次にリスト3-2を見てみます。:U0CTL1,#%02リスト3-2の2~3行目は、マイコンの汎用入出力ポート(A~D)のAポートの設定です。このマイコンのポートの設定は少し複雑で、データ方向レジスタが隠されています。このため、まず2行目でデータ方向レジスタを見えるようにしてから、3行目で入力/出力を決定しています。同様に、5~6行目ではCポートの入力/出力を決定しています。9~13行目は、シリアル通信(RS-232Cポート)の設定です。汎用入出力ポートと同様、機能を設定するレジスタが見えるようにしてから、10行目で対応するICのピンの機能を設定しています。11行目は、必要かどうかはわかりませんが念のため入れてあります。12行目は、シリアル通信の色々なパラメータの設定で、これは隠されていないので直接操作できます。以上が、本キットファームウェアの初期設定の主要部分です。データ方向レジスタが隠れていることと、データ方向レジスタに0(1)を書き込むと出力(入力)であることに注意してください。次回は、ターミナル(パソコン)との送受信サブルーチンを見ていくことにします。送受信サブルーチン(2016/11/06掲載,2016/11/08最終変更)マイコンの送受信に関しては1つの悩ましい問題があります。昔のパソコンなら背面のパネルにCOMポートがあり、マイコン側は信号電圧を変換するだけで簡単な調歩同期方式で通信ができました。ところが、最近のパソコンにはUSBポートはありますが、COMポートはありません。ことになってしまいます。実は、このUSBの処理というが結構難易度が高く、できれば避けて通りたいところです。手っ取り早い解決方法として、パソコンとマイコンを市販の「USB-シリアル変換ケーブル」で接続する方法があります。(*1)本キットでは、この一番手っ取り早い解決方法を使っています。キットの送信サブルーチンを見てみましょう。RETリスト4-1の5行目でシリアル通信のステータスレジスタを読んでいます。6行目でそのビット2(送信データが書き込み可能なら1となるフラグ)を見ています。Zero)命令は、その名の通り指定レジスタの指定ビットが0ならジャンプする命令です。この2行(ラベルL2000を含むと3行)で送信データが書き込み可能になるまでループで待つ処理をおこなっていることになります。ビット2が1(送信データが書き込み可能)になったらこのループを抜けて、8行目で送信データを送信データレジスタに書き込んでいます。後はマイコンのハードウェアが自動的に調歩同期方式で送信を行ってくれます。次に受信サブルーチンを見てみましょう。考え方は、送信サブルーチンとほぼ同じです。RETリスト4-2の4行目でシリアル通信のステータスレジスタを読んでいます。5行目でそのビット7(受信データが読み出し可能なら1となるフラグ)を見ています。この2行(ラベルL2010を含むと3行)で受信データが読み出し可能になるまでループで待つ処理をおこなっていることになります。ビット7が1(受信データが読み出し可能)になったらこのループを抜けて、6行目で受信データを受信データレジスタから読み出しています。以上が送受信サブルーチンです。次回は、パラレルポートの入出力を見ていくことにします。--------------------(*1)USBーCOMポート変換をデバイスドライバに処理させるため、パソコンアプリケーション(ターミナルソフトなど)からもCOMポートに見えます。パラレルポートの入出力(2016/11/20掲載,2018/12/15最終変更)今回はパラレルポートの入出力について見てみます。初期設定(リスト3-2)で説明した内容がほぼすべてですが、ここではハードウェアとの関連で見てみます。マイコンにPAx,PBx,PCx,PDx(x=0~7)というピン名があることが判ります。回路図を見るとスイッチSW4はマイコンのピンPA3に接続されていて、マイコンにとっては入力装置です。したがって、PA3のデータ方向レジスタは入力に設定しなければなりません。リスト3-2を見ると、確かに次の2行でPA3は入力に設定されていることが判ります。'PA3,PA2,PA1,PA0=1(INPUT)さらに回路図を見ると3V3(3.3V)が10kΩの抵抗を介してPA3に常時接続されています。スイッチSW4を押したときだけGNDにも接続されます。スイッチSW4を押しているときはPA3はLレベルとなり、ポートA入力レジスタのビット3には0が現れます。最初に書いたように、マイコンはプロトコルの面倒まで見ません。単純に、入力ポートの電圧状態(HレベルまたはLレベル)を入力レジスタに反映(1または0)させるだけです。次に出力ポートを見てみましょう。LED1はマイコンのピンPC6に接続されていて、マイコンにとっては出力装置です。したがってPC6のデータ方向レジスタは出力に設定しなければなりません。リスト3-2を見ると、確かに次の2行でPC6は出力に設定されていることが判ります。回路図を見ると3V3(3.3V)が制限抵抗330ΩとLED1を介してPC6に接続されています。これは、ポートC出力レジスタ(具体的にはFDBH番地)のビット6に0を書き込んだ状態です。反対に、ポートC出力レジスタのビット6に1を書き込んだ状態では、電流は流れずLEDは光ません。以上でわかる通り、パラレルポートは初期設定してしまえば後はメモリ(RAM)と大差ありません。外部ピンの電圧レベルと連動したメモリと考えると解りやすいと思います。次回から数回にわたりマイコン(eZ8CPUコア)の命令を見ていきましょう。難しいわけではありませんが、結構ユニークな部分があります。(*3)--------------------(*1)よく見ると、PC7やPD3が見あたりませんが、40ピンというピン数の制約だと思います。