ザイログのマイコンZ8 Encore!の機械語プログラミング、および市販部品を集めて作るマイコンボードの自作方法について解説します。
初めて訪れる方は「ごあいさつ」からご覧ください。
------------------------------------------------------------
目次
------------------------------------------------------------
ごあいさつ
--- 機械語プログラミング編 ---
第1回 ハードウェア概要と開発環境
第2回 電源投入からのプログラム実行まで
第3回 プログラム実行で最初に行うこと
第4回 送受信サブルーチン
第5回 パラレルポートの入出力
第6回 eZ8CPU命令(1)
第7回 eZ8CPU命令(2)

--- マイコンボード自作編 ---
第1回 自作マイコンボードの概要
第2回 部品の入手からボードの組立まで
第3回 ファームウェアの書込、マイクロBASICの実行
第4回 アセンブリ言語プログラムの作成と実行


------------------------------------------------------------
記事中のプログラム・資料
------------------------------------------------------------
※本記事中で使用するプログラム・資料はここからダウンロードできます。
eZ8アセンブラ開発ツール集 Vol.1 (tools1c.zip)
Micro BASIC for ZCPU1 Version1.02 (
os_basic102a.zip)

■ごあいさつ(2016/10/01掲載,2021/03/13最終変更)
 このページではザイログのマイコンZ8 Encore!(*1)の1つZ8F6421PM020SGの機械語プログラミングを解説します。
 このマイコンは日本語の技術資料が少なく、英文マニュアルが苦手の人にはとっつきが悪いのですが、所詮コンピュータ用語の羅列です。
 何とか慣れてしまえば、アセンブラで遊ぶ/学ぶには最適なマイコンです。(理由はコラム「色々」の「ごあいさつ」をご覧ください)
 ここでは、マイコンキットZCPU1シリーズ(またはその互換ボード)で具体的に説明しますが、メーカー純正の開発ツール(*2)を使用する方にも参考になることと思います。
 私の理解不足から間違った説明をしてしまうことがあるかもしれませんが、それはご了承ください。

 なお、本ページは2021年2月「eZ8マイコンボードの自作」と名称変更しました。
 従来の内容は「機械語プログラミング編」となり、 今後は主に「マイコンボード自作編」の方で市販部品を集めてマイコンボードを製作する解説を行ってゆきます。
 はじめてマイコンを体験する方にとってはかなり難しい作業となりますが、この作業には小規模ながらハードウェア製作から、機械語、高級言語までのプロセスが含まれています。
 興味のある方は是非チャレンジしてみてください。
 では、始めます。
--------------------
(*1)厳密には、Z8 Encore!(R)、Z8 Encore! XP(R)、Z8 Encore! MC(TM)の3種類(無印、XP、MC)があり、このうちのXPです。
(*2)ザイログ社から直接購入か、Digi-Key(http://www.digikey.jp/)から購入可能かと思います。

------------------------------------------------------------
機械語プログラミング編
------------------------------------------------------------
■第1回 ハードウェア概要と開発環境(2016/10/01掲載,2021/03/07最終変更)
 まず最初に、プログラム開発する対象マイコン(Z8F6421PM020SG)のハードウェアの特徴を知る必要があります。
 このマイコンの特徴を列挙します。

・8ビットCPUコア(eZ8)内蔵のマイクロコントローラ
・40ピンDIPパッケージ、3.3V動作
・ROM64Kバイト、RAM4Kバイト、各種I/O、オンチップデバッガー(*1)内蔵
・最小外付部品はセラミック振動子と若干の抵抗のみ(ROM書込時にはさらに数個の部品が必要)
・リセット解除(電源投入)後、内蔵ROMの2~3番地に書かれたベクタアドレスからプログラム実行
・各種コントロールレジスタはRAM空間の最後0F00H~0FFFH
・RAMに対し16バイト、256バイト、4Kバイトのアドレッシングモードがある
・ROMアドレス空間とRAMアドレス空間は別々にあり、RAM上の機械語プログラムは実行不可

 他のマイコンでプログラミング経験のある方は、以上の情報でZ8 Encore!の全体像が理解いただけたと思います。
 あとは、マニュアルとサンプルプログラムがあれば、3日後にはプログラムを書き始められる方もいるとは思いますが、ここではもう少し丁寧に説明します。

 次に参考資料ですが、次のものがあります。
 ここでは、参考資料が手元になくても読めるようにしていくつもりですが、実機でプログラミングする方はダウンロードをお勧めします。

・マイコンメーカーのマニュアル2冊(CPUコアとマイコン)(*2)
・マイコンキット関連資料(アセンブラ命令形式、キットおよび添付ソフトの取扱説明書、回路図、ファームウェアリスト抜粋)(*3)
--------------------
(*1)名前の通りマイコンチップに内蔵のデバッガーで、外部とのシリアル通信でROM読出/書込/消去が可能です。
(*2)具体的には次のマニュアルです。ザイログ社のホームページ(http://www.zilog.com/)等からダウンロードできます。
 eZ8 CPU User Manual(UM0128)
 Z8 Encore! XP F64xx Series Product Specification (PS0199)
(*3)具体的には次のマニュアルです。(2016年10月時点)(*4)
 本ホームページの「関連文書」からダウンロードできます。
 取扱説明書 (doc1c.pdf)
 添付ソフトウェア取扱説明書 (doc2b.pdf)
 添付アセンブラ命令形式 (doc4.pdf)
 回路図 (kairo-zcpu1r2.pdf)
 ファームウェアリスト抜粋 (rom-zcpu1v102.txt)
(*4)2021年2月、これらの関連文書とアセンブラ、ROM書込ツールを纏めた「eZ8アセンブラ開発ツール集」を公開しました。
このページのトップからダウンロードできます。

■第2回 電源投入からのプログラム実行まで(2016/10/09掲載,2016/10/22最終変更)
 第1回で触れましたが、このマイコンは電源投入後、内蔵ROMの2~3番地に「書かれたベクタアドレス」のプログラムから実行します。(*1)
 今回は、この電源投入後マイコンを正しく動作させるために必要なプログラムを見てみます。
 プログラム例としてキットのファームウェアリストを使います。
 本当は長いリストなのですが、ここでは説明に不要な部分を省略して表記しています。

【リスト2-1】
                :PAADDR EQU %FD0        'PORT A ADDRESS(01H:DATA DIRECTION,02H:PACTL=ALTEMATE FUNCTION)
                :PACTL  EQU %FD1        'PORT A CONTROL
                :PAIN   EQU %FD2        'PORT A INPUT DATA
                :PAOUT  EQU %FD3        'PORT A OUTPUT DATA
                '
                :PCADDR EQU %FD8        'PORT C ADDRESS(01H:DATA DIRECTION,02H:PACTL=ALTEMATE FUNCTION)
                :PCCTL  EQU %FD9        'PORT C CONTROL
                :PCIN   EQU %FDA        'PORT C INPUT DATA
                :PCOUT  EQU %FDB        'PORT C OUTPUT DATA
                '
                :FLAGS  EQU %FFC        'FLAGS
                :RP     EQU %FFD        'REGISTER POINTER
                :SPH    EQU %FFE        'STK POINTER H
                :SPL    EQU %FFF        'STK POINTER L


リスト2-1では、EQU疑似命令でマイコン内蔵レジスタのアドレスにラベル(名前)を割り当てています。
これにより内蔵レジスタをアドレスではなく名前で呼ぶことができ、プログラムは格段に見やすくなります。
ラベルは何でも構わないのですが、メーカーで決めたれレジスタ名を使った方が便利です。(*3)
なお、本アセンブラ特有のルールなのですがラベル先頭にはコロン(:)を付けます。 

リストを見ると左側のアドレス、データ部分が空白になっています。
これは単なるラベルに数値を割り当てているだけで、アセンブラがコードを生成しないからです。

 では、次にリスト2-2を見てみます。

【リスト2-2】
 
                   ORG %0000       '以降、0番地からコード展開
                'DB文で、ROM空間のメモリに数値を置くことが可能
0000 EF             DB  %EF         'オプションビット設定(OSC SEL=10)
0001 FF             DB  %FF
                '
0002 00             DB  %00         'リセットベクター(0038番地へジャンプ)
0003 38             DB  %38
(途中省略)
0038 8D0068         JP  :START      'システムコール38h(56) START   (非公開)システムスタート


リスト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)。
リストの左側を見ると「8D0068」と書いてありますが、これがJP命令(JP :START)の機械語です。
 
次回は、START以降のプログラムを見ていくことにします。
--------------------
(*1)2~3番地に書かれたプログラムから実行ではないことに注意してください。
(*2) マイコン内蔵ROMは、マイコンメーカーから消去状態(データFFH)で出荷されています。(一部CPU情報エリアは例外)
キットZCPU1/K(E)のマイコン内蔵ROMに書き込まれているプログラムは、後から書き込んだものです。
(*3)メーカー純正ツーの場合、ヘッダファイルとして提供されているかも知れません。この場合、ヘッダファイルをプログラム先頭でインクルードする必要があ りま す。
(*4)詳細は、マイコンチップの方のマニュアルのオプションビット(Option Bits)を見てください。
(*5)せっかく、38番地から実行できるのに、わざわざ別の番地(START)へジャンプさせるのは本キットの都合です。
新規にマイコンのプログラムを開発する場合は、わざわざ別の番地にジャンプさせる必要はなく、ここから(この場合38H番地)からプログラムを書いてかまいません。

■第3回 プログラム実行で最初に行うこと(2016/10/22掲載,2016/11/05最終変更)
前回は、マイコンの電源が投入されてから最初の命令を実行するまでのプログラムを説明しました。
このプログラムをマイコンのROMに書き込んで電源投入すれば、マイコンは最初の命令を正しく実行します。
しかし、この時点ではマイコン内部のレジスタやマイコンの各ピンの機能はマイコンチップ内部のハードウェアで決められた初期状態になっています。
マイコンに目的の処理(機械制御、言語処理など)を行わせるためには、この初期状態を適切な状態に変更(初期設定)する必要があります。
今回はこの初期設定について説明します。
では、プログラム例としてキットのファームウェアの初期設定を見てみましょう。

【リスト3-1】
                :START
0068 8F             DI              '割込禁止
0069 0100           SRP #%00        'RP=0(ワーキングレジスタを000h~00Fh番地に割り当てる)
006B E9010FFE       LDX :SPH,#%01   'スタックポインタ設定(100h)
006F E9000FFF       LDX :SPL,#%00
0073 E9000F46       LDX :U0BRH,#0   'BR=26(4MHzのとき、9600bps)
0077 E91A0F47       LDX :U0BRL,#26


リスト3-1の2行目では、DI(Disable Interrupts)命令で割込禁止にしています。
本キットのファームウェアでは割込を使用していないのでこのようにしています。
なお、割込が必要な場合は、後でEI(Enable Interrupts)命令で割込を許可することが可能です。

3行目にはSRP(Set Register Pointer)命令があります。
ここでは、RP(Register Pointer)を00Hとしています。
このマイコンはRAMの任意の16バイト範囲(xx0H~xxFH番地)をレジスタr0~r15として扱うことができ、このときRPでxx部分を 指定 します。
RP=00Hとしたので、r0~r15は000H~00FH番地に割り当てられることになります。

4~5行目では、サブルーチンや割込で使用するスタックポインタを設定しています。
ここでは100H番地に設定しているので、100H番地"未満"のFFH,FEH,FDH…番地のRAMがスタックエリアに使用されます。
どこまで使用されるかはプログラムによって決まります。

6~7行目では、シリアル通信の通信速度を設定しています。
通信速度はマイコンのクロック(4MHz)をどの程度分周するかで決まります。
ここでは9600bpsに設定しています。

では、次にリスト3-2を見てみます。

【リスト3-2】
                'PA0-PA3初期化(キースイッチ)
007B E9010FD0       LDX :PAADDR,#%01    'DATA DIRECTION選択
007F E90F0FD1       LDX :PACTL,#%0F     'PA3,PA2,PA1,PA0=1(INPUT)
                'PC2-PC5初期化(EEPROM)
0083 E9010FD8       LDX :PCADDR,#%01    'DATA DIRECTION選択
0087 E9200FD9       LDX :PCCTL,#%20     'PC5=1(INPUT),PC6,PC4,PC3,PC2=0(OUTPUT)
(途中省略)
                'UART1初期化
009C E9020FD0       LDX :PAADDR,#%02    'ALTEMATE FUNCTION選択
00A0 E9F00FD1       LDX :PACTL,#%F0     'PA7,PA6,PA5,PA4=ALTEMATE FUNCTION(SDA,SCL,TXD0,RXD0)
00A4 E9000FD0       LDX :PAADDR,#%00    '選択保護
00A8 E9C00F42       LDX :U0CTL0,#%C0    '送受信有効、CTS無効、パリティなし、1ストップビット
00AC E9020F43       LDX :U0CTL1,#%02


リスト3-2の2~3行目は、マイコンの汎用入出力ポート(A~D)のAポートの設定です。
多くのマイコンは、データ方向レジスタの各ビットに0または1を書き込むと、対応するICのピンが入出力のどちらの機能で動作するかが決定されま す。
このマイコンのポートの設定は少し複雑で、データ方向レジスタが隠されています。
このため、まず2行目でデータ方向レジスタを見えるようにしてから、3行目で入力/出力を決定しています。

同様に、5~6行目ではCポートの入力/出力を決定しています。

9~13行目は、シリアル通信(RS-232Cポート)の設定です。
汎用入出力ポートと同様、機能を設定するレジスタが見えるようにしてから、10行目で対応するICのピンの機能を設定しています。
11行目は、必要かどうかはわかりませんが念のため入れてあります。
12行目は、シリアル通信の色々なパラメータの設定で、これは隠されていないので直接操作できます。

以上が、本キットファームウェアの初期設定の主要部分です。
特に、データ方向レジスタが隠れていることと、データ方向レジスタに0(1)を書き込むと出力(入力)であることに注意してください。

次回は、ターミナル(パソコン)との送受信サブルーチンを見ていくことにします。

■第4回 送受信サブルーチン(2016/11/06掲載,2016/11/08最終変更)
マイコンの送受信に関しては1つの悩ましい問題があります。
昔のパソコンなら背面のパネルにCOMポートがあり、マイコン側は信号電圧を変換するだけで簡単な調歩同期方式で通信ができました。
ところが、最近のパソコンにはUSBポートはありますが、COMポートはありません。
それならUSBということで、パソコンとマイコンをUSBケーブルで接続すればハード的には解決ですが、この方法ではUSBの処理をマイコン側が 行うことになってしまいます。
実は、このUSBの処理というが結構難易度が高く、できれば避けて通りたいところです。

一番手っ取り早い解決方法として、パソコンとマイコンを市販の「USB-シリアル変換ケーブル」で接続する方法があります。
この方法は、マイコン側からパソコンがCOMポートとして見えるため、USBの処理が不要となり、従来通りの簡単な調歩同期方式で通信ができることになります。(*1)
本キットでは、この一番手っ取り早い解決方法を使っています。

では、キットの送信サブルーチンを見てみましょう。

【リスト4-1】
                :OUTCH
0112 7000           PUSH 0
                'モードによらず端末、液晶表示器の両方に表示
                :L2000
0114 840F41         LDX  r0,:U0STAT0    'TRN REG FULL?
0117 F620FA         BTJZ 2,r0,:L2000
011A 5000           POP  0
011C 940F40         LDX  :U0TXD,r0      'TRN
(途中省略)
012E AF             RET


リスト4-1の5行目でシリアル通信のステータスレジスタを読んでいます。
6行目でそのビット2(送信データが書き込み可能なら1となるフラグ)を見ています。
6行目のBTJZ(Bit Test and Jump if Zero)命令は、その名の通り指定レジスタの指定ビットが0ならジャンプする命令です。
つまり、この2行(ラベルL2000を含むと3行)で送信データが書き込み可能になるまでループで待つ処理をおこなっていることになります。

ビット2が1(送信データが書き込み可能)になったらこのループを抜けて、8行目で送信データを送信データレジスタに書き込んでいます。
後はマイコンのハードウェアが自動的に調歩同期方式で送信を行ってくれます。

次に受信サブルーチンを見てみましょう。
考え方は、送信サブルーチンとほぼ同じです。

【リスト4-2】
                :INPCH
(途中省略)
                :L2010
0134 840F41         LDX  r0,:U0STAT0    'REC REG EMPTY?
0137 F670FA         BTJZ 7,r0,:L2010
013A 840F40         LDX  r0,:U0RXD      'REC
013D AF             RET


リスト4-2の4行目でシリアル通信のステータスレジスタを読んでいます。
5行目でそのビット7(受信データが読み出し可能なら1となるフラグ)を見ています。
この2行(ラベルL2010を含むと3行)で受信データが読み出し可能になるまでループで待つ処理をおこなっていることになります。

ビット7が1(受信データが読み出し可能)になったらこのループを抜けて、6行目で受信データを受信データレジスタから読み出しています。

以上が送受信サブルーチンです。
このサブルーチンはループで送受信のフラグを監視する方法ですが、別の方法としてループで待たずに割込みで送受のフラグを監視する方法もありま す。

次回は、パラレルポートの入出力を見ていくことにします。
--------------------
(*1)USBーCOMポート変換をデバイスドライバに処理させるため、パソコンアプリケーション(ターミナルソフトなど)からもCOMポートに見えます。

■第5回 パラレルポートの入出力(2016/11/20掲載,2018/12/15最終変更)
 今回はパラレルポートの入出力について見てみます。
 パラレルポートは処理が単純(というよりは通信の約束事(プロトコル)をソフトウェアに任せているためマイコンが面倒を見ないという意味で単純) で す。
 すでに初期設定(リスト3-2)で説明した内容がほぼすべてですが、ここではハードウェアとの関連で見てみます。

【リスト3-2の一部(再掲)】
 
                'PA0-PA3初期化(キースイッチ)
007B E9010FD0       LDX :PAADDR,#%01    'DATA DIRECTION選択
007F E90F0FD1       LDX :PACTL,#%0F     'PA3,PA2,PA1,PA0=1(INPUT)
                'PC2-PC5初期化(EEPROM)
0083 E9010FD8       LDX :PCADDR,#%01    'DATA DIRECTION選択
0087 E9200FD9       LDX :PCCTL,#%20     'PC5=1(INPUT),PC6,PC4,PC3,PC2=0(OUTPUT)

 
図4-1は、マイコンキットの回路図の一部分を抜粋したも のです。
マイコンにPAx,PBx,PCx,PDx(x=0~7)というピン名があることが判ります。(*1)


                                        【図4-1】マイコンキットの回路図の一部分
 
回路図を見るとスイッチSW4はマイコンのピンPA3に接続されていて、マイコンにとっては入力装置です。
したがって、PA3のデータ方向レジスタは入力に設定しなければなりません。
リスト3-2を見ると、確かに次の2行でPA3は入力に設定されていることが判ります。

007B E9010FD0       LDX :PAADDR,#%01    'DATA DIRECTION選択
007F E90F0FD1       LDX :PACTL,#%0F     'PA3,PA2,PA1,PA0=1(INPUT)


さらに回路図を見ると3V3(3.3V)が10kΩの抵抗を介してPA3に常時接続されています。
また、スイッチSW4を押したときだけGNDにも接続されます。
したがって、スイッチSW4を押していなときはPA3はHレベルとなり、ポートA入力レジスタ(具体的にはFD2H番地)のビット3には1が現れ ま す。
また、スイッチSW4を押しているときはPA3はLレベルとなり、ポートA入力レジスタのビット3には0が現れます。
最初に書いたように、マイコンはプロトコルの面倒まで見ません。
単純に、入力ポートの電圧状態(HレベルまたはLレベル)を入力レジスタに反映(1または0)させるだけです。

では、次に出力ポートを見てみましょう。
LED1はマイコンのピンPC6に接続されていて、マイコンにとっては出力装置です。
したがってPC6のデータ方向レジスタは出力に設定しなければなりません。
リスト3-2を見ると、確かに次の2行でPC6は出力に設定されていることが判ります。

回路図を見ると3V3(3.3V)が制限抵抗330ΩとLED1を介してPC6に接続されています。(*2)
したがって、PC6がLレベル(ほぼ0V)のときのみ、制限抵抗330ΩとLED1両端に電位差(3.3V)が発生し電流が流れLEDが光りま す。
これは、ポートC出力レジスタ(具体的にはFDBH番地)のビット6に0を書き込んだ状態です。
反対に、ポートC出力レジスタのビット6に1を書き込んだ状態では、電流は流れずLEDは光ません。

以上でわかる通り、パラレルポートは初期設定してしまえば後はメモリ(RAM)と大差ありません。
外部ピンの電圧レベルと連動したメモリと考えると解りやすいと思います。

次回から数回にわたりマイコン(eZ8CPUコア)の命令を見ていきましょう。
難しいわけではありませんが、結構ユニークな部分があります。(*3)
--------------------
(*1)よく見ると、PC7やPD3が見あたりませんが、40ピンというピン数の制約だと思います。
(*2)キットのLED1の配線では出力ポートがLのとき電流が流れ込みますが、出力ポートがHのとき電流が流れ出す配線(LEDの向きが逆になる)でもかま いま せん。
(*3)レジスタをいわゆるRAMに配置し直接RAMをいじれたり、命令のオペランドが特定パターンのとき別動作をしたりと、自由奔放(?)なアーキテクチャ で す。

■第6回 eZ8CPU命令(1)(2017/01/04掲載)
今回から数回、マイコン(eZ8CPUコア)の命令を説明していくことにします。(*1)
命令は、一般に次の形式で表せます。

 <ラベル> <命令ニーモニック> <オペランド1>,<オペランド2>,<オペランド3>

ここで、<ラベル>は必要無ければ省略可能です。
また、<命令ニーモニック>の後にオペランドがいくつ続くかは、命令によって異なります。

次に、eZ8CPUの命令を便宜的に分類してみました。
アセンブラのプログラミング経験のある人は、おおよそ2/3の命令はニーモニックだけでどんな命令か予測がつくと思います。
オペランド0個 BRK,NOP,ATM,WDT,STOP,HALT,DI,EI,RET,IRET,RCF,SCF,CCF
オペランド1個 SRP,RLC,INC,DEC,DA,POP,COM,PUSH,DECW,RL,INCW,CLR,RRC,SRA,RR,SWAP,BSWAP,MUL,SRL,TRAP,PUSHX,POPX
オペランド2個 ADD,ADC,SUB,SBC,OR,AND,TCM,TM,CP,XOR,CPC,ADDX,ADCX,SUBX,SBCX,ORX,ANDX,TCMX,TMX,CPX,XORX,CPCX
ロー ド命令 LDE,LDC,LDEI,LDCI,LDWX,LEA,LD,LDX
ジャンプ・ビット操作 JP,JR,CALL,BTJZ,BTJNZ,DJZN,BIT0,BIT1

次にレジスタについて説明します。
あまりしっくりこないのですが、eZ8CPUでは4KバイトのRAMはメモリではなくレジスタと呼んでいます。
したがって、4Kバイトのメモリはレジスタの感覚で直接操作可能です。
ただし、プログラマがメモリを直接操作するのに慣れていないと、非常に違和感があります。(*2)

次に、オペランドについて簡単に説明します。
種々のオペランド表現がありますが、基本は、定数、4ビットレジスタ、8ビットレジスタ、12ビットレジスタの4種類です。

(1)定数
先頭に記号(#)を付けることで10進数定数を意味します。さらに記号(%)を付けると16進定数を意味します。

 例
LD %FE,#123        '定数123をRAMのFEh番地に転送

(2)4ビットレジスタ(ワーキングレジスタ)
r0~r15と表現されていた場合、ワーキングレジスタを意味します。
ワーキングレジスタは、メモリ(RAM)上の任意の場所(レジスタポインタRPで指定)に設けられた連続した16個の8ビットレジスタです。
4ビットでレジスタが指定できるため、短い命令サイズが可能です。

INC    r15            'ワーキングレジスタ15を+1加算

(3)8ビットレジスタ
4KバイトのRAMの先頭256バイト(00h~FFh番地)を意味します。特にレジスタを示す記号(Rなど)は付けません。

ADD %23,%24    '23h番地の内容と24h番地の内容を加算して23番地に保存

(4)12ビットレジスタ
4KバイトのRAM全体(000h~FFFh番地)を意味します。特にレジスタを示す記号(Rなど)は付けません。

ADDX %8FF,%D12    '8FFh番地の内容とD12h番地の内容を加算して8FFh番地に保存

 定数や、4ビットレジスタは記号(#やr)で明示されていますが、8ビットレジスタと12ビットレジスタは記号がありません。
 この2つは、ニーモニックで区別しています。(*3)

 今回は、ここまで。
--------------------
(*1)以下の説明は、キット付属のアセンブラによる説明でメーカー純正ツール純正と異なる部分があることをご了承ください。
(*2)ワーキングレジスタの番地を固定し、汎用レジスタのように使う方法も可能です。
(*3)すべて当てはまるかどうかはわかりませんが、ニーモニック末尾にXが付くと12ビットレジスタみたいです。

■第7回 eZ8CPU命令(2)(2021/10/24掲載)
今回は、ジャンプ命令・ビット操作命令について解説します。

下表は、資料「ZASMB!アセンブラ命令形式(第5版)」から今回の該当部分抜粋したもので、類似の命令ごとに色でグループ分けしてあります。(*1)
各命令には、その命令がサポートしている引数の欄に●印が表記してあります。
例えば、JP命令は「JP %hhhh」「JP /CC,%hhhh」「JP @RRn」の3つの命令パターンがあります。
なお、命令欄に括弧で別の命令が併記してあるものがありますが、これは元の命令の別の表現形式で、どちらの表現を使ってもかまいません。



引数欄の記号については、下の表を見てください。(*2)

では、各グループごとに命令を見てゆきます。

(1)ジャンプ命令(表の
の部分)
ここでいうジャンプ命令とは、表の緑の部分の命令グループです。

「JP /cc,%hhhh」命令は、コンディションコードの条件(/CC)が成立したとき、16ビットで表記された絶対番地(ラベル使用可)にジャンプする命令です。
条件(/CC)は省略可能で、省略した場合、無条件ジャンプ(必ずジャンプする)命令となります。
この命令は、直前にCP(Compare)命令で2つの数値の大小関係を調べておき、特定の条件のときのみジャンプさせたい場合によく使われます。(リスト7-1)
【リスト7-1】ファームウェアの一部
015E E4B700             LD 0,:KY2B             'キースイッチ2押下か?
0161 560007             AND 0,#%07
0164 A60004             CP 0,#%04
0167 6D01A1             JP /EQ,:L20140


「JP @RRn」命令は、ペアレジスタ(Rn,Rn+1)の内容をジャン先アドレスとして無条件ジャンプする命令です。

「JR /cc,RA」命令は「JP /cc,%hhhh」命令の相対アドレス版と考えると理解しやすいです。
この命令の直後の命令を基準アドレス(0)として、そこから-128~+127番地の範囲でしかジャンプできませんが、命令サイズが小さい利点があります。
当然ですが、相対アドレス計算はアセンブラが自動的に行います。

(2)サブルーチンコール命令(表の
の部分)
サブルーチンを実行(コール)する命令で、指定したアドレスのサブルーチンにジャンプし、そのサブルーチンの中でRET命令を実行すると、CALL命令の次のアドレスに戻ってきます。

「CALL %hhhh」命令は、ROMアドレス範囲(0000h~FFFFh番地)を指定できる普通のサブルーチンコール命令です。
ラベルで指定することもできます。(リスト7-2)
【リスト7-2】ファームウェアの一部
010A D6062D           CALL :BASIC           'BASICインタプリタ実行

「CALL @%hh」命令は、RAMのhh番地とhh+1番地に書かれたデータをサブルーチンアドレスとしてコールする命令です。
ただ、この説明だと、メーカーの資料(eZ8 CPU User Manual(UM0128)のp112~p114)の仕様と(たぶん)一致しません。
ファームウェアでも使用していて、特に支障なく動作しているみたいなのですが、私の勘違いか、資料の誤記かの判断がつきません。
本命令を使用する際は、ご自分の目で動作を確認してください。(リスト7-3)
【リスト7-3】ファームウェアの一部
0A85 D424             CALL @:LR               '右辺の値をアドレスとする機械語サブルーチンをコール


(3)比較+分岐命令(表の
の部分)
比較と分岐を1つの命令で実行する命令群です。

「BTJZ b,Rn,RA」命令は、レジスタRnの内容のビットbが0なら、RAで示す相対番地へジャンプする命令です。
この命令は「BTJ0 b,Rn,RA」と記述してもかまいません。

また「BTJNZ b,Rn,RA」命令は、レジスタRnの内容のビットbが1なら、RAで示す相対番地へジャンプする命令です。
この命令は「BTJ1 b,Rn,RA」と記述してもかまいません。(リスト7-4)
【リスト7-4】ファームウェアの一部 (リスト4-2の再掲)
                :INPCH
(途中省略)
                :L2010
0134 840F41         LDX  r0,:U0STAT0    'REC REG EMPTY?
0137 F670FA         BTJZ 7,r0,:L2010
013A 840F40         LDX  r0,:U0RXD      'REC
013D AF             RET


なお、Rnの代わりに@Rnとした場合、ビット判定の対象はレジスタRnの内容ではなく、レジスタRnの内容1バイトをアドレスとするメモリの内容となります。

「DJNZ」命令は、レジスタRnをデクリメント(-1)して、その結果が0以外なら、RAで示す相対番地へジャンプするループ処理に最適な命令です。

(4)ビット操作命令(表の
の部分)
これらの命令は、単に指定ビットのみ0または1にする命令で、条件分岐はしません。

「BIT0 b,Rn」命令はレジスタRnのbで示すビットを0にし、「BIT1 b,Rn」命令はレジスタRnのbで示すビットを1にします。
指定ビット以外は、この命令で変化しません。
これらの命令は「BCLR b,Rn」「BSET b,Rn」と記述してもかまいません。

最後に、今回の命令のアセンブル実行例を以下に示します。
プログラム自体は意味のない命令の羅列ですが、本アセンブラ(ZASMB!)での記述の参考としてください。



次回も引き続き、命令の解説を行う予定です。
--------------------
(*1)さらっと言ってるけど、前回は4年半前のことで、資料も訂正しまくりで2021年10月時点で第5版になっています。バレてるかな。f(^_^;
(*2)コンディションコード(CC)の詳細については、メーカーの資料(eZ8 CPU User Manual(UM0128)のp5~p9)をご覧ください。

------------------------------------------------------------
マイコンボード自作編
------------------------------------------------------------
■第1回 自作マイコンボードの概要(2021/03/14掲載,2022/03/21最終変更)
ここからは、実際にマイコンボードを自作する解説になります。

自作するマイコンボードの仕様ですが、ざっくりいうとマイコンキット「ZCPU1/KE」の互換ボードです。
使用するマイコン(LSI)は、ザイログ製の8ビットマイクロコントローラです。
このLSIの詳細は、本ページ「機械語プログラミング編 第1回 ハードウェア概要と開発環境」に説明してありますので、ここでは省略します。

さて、部品の配線ですが、ユニバーサル基板を使って半田付けするか、ブレッドボードを使ってジャンパ線で配線するかは好みで決めてかまいません。
ちなみに、私はブレッドボードで製作して、回路が決まったらホットメルトで固める主義です。

次に、完成した自作マイコンボードに対して、キーボードで指示を与え、結果をディスプレイに表示するための端末装置(ターミナル)について説明します。
これは、Windowsパソコンにターミナルソフトを走らせて、これを端末装置の代用とします。
当初、このパソコンとマイコンボードとの接続ケーブルにはキットと同じく「USB-シリアル変換ケーブル」を使用する予定でした。
後で説明する資料(eZ8アセンブラ開発ツール集 Vol.1 )も、この方法による回路図(henko-kairo.bmp henko-kairo.pdf)を同梱してあります。
しかし、今回の自作マイコンボードでは、できるだけ配線数を少なくするため、USBを3.3Vのシリアル信号に変換するモジュールを使用することにしました。

この「USB-シリアル変換モジュール」を使用するメリットとしては
・ピンが2.54mmピッチなので、直接ブレッドボードに挿入することができ、コネクタ周辺の半田付け作業が不要になる
・パソコンとマイコンボードを入手が容易なUSBケーブルで接続できる
・3.3V電源を内蔵しているので、これをマイコンボードの電源に使用できる
が挙げられます。
デメリットとしては、少し特殊な部品となるため、まず家電量販店では入手できません。
秋葉原などの電気街か通販で入手する必要がありますが、どうせマイコン(LSI)を入手しなければならないので、一緒に入手すればそれ程手間にはならないと思います。

今後の作業は、次のステップを踏むことになります。
(ステップ1)技術情報、ソフトウェアを入手
(ステップ2)部品を選定、購入
(ステップ3)マイコンボードを組立
(ステップ4)ファームウェアをアセンブル後、ROMに書込
(ステップ5)マイクロBASICのプログミングと実行
(ステップ6)アセンブリ言語のプログミングと実行

今回はステップ1まで進めます。
次の4個のファイルをダウンロードして(解凍して)おいてください。

(1)eZ8アセンブラ開発ツール集 Vol.1 (*1)
(2)Micro BASIC for ZCPU1 Version1.02
(3)eZ8 CPU User Manual(UM0128)
(4)Z8 Encore! XP F64xx Series Product Specification (PS0199)

ここで(1)(2)は、本ページの先頭からダウンロードできます。
(3)(4)はマイコンメーカー(ザイログ)のホームページからダウンロードしてください。(1)のappendixフォルダ内に(3)(4)のダウンロード方法が書いてあります。

次回は、ステップ2と3を解説する予定です。
--------------------
(*1)appendixフォルダ内に回路図などのドキュメントが入っています。

■第2回 部品の入手からボードの組立まで(2021/03/23掲載,2022/05/08最終変更)
今回は、部品を入手してボードの組立までを説明したいと思います。

まず、eZ8アセンブラ開発ツール集に同梱されている回路図(henko-kairo.bmp henko-kairo.pdf)を見てみましょう。
この回路図は、元々マイコンキットZCPU1シリーズの回路図で、これに自作する場合の変更箇所、部品情報を赤字で記載したものです。


この回路図の赤字の説明の通り製作してパソコンと「USB-シリアル変換ケーブル」で接続しても、もちろん動作します。
マイコンキット「ZCPU1/KE」の互換ボードですから当然です。

ただ、前回ちょっと触れましたが、キット(ZCPU1/KE)の場合は専用のプリント基板に部品を半田付けするので簡単に組み立てられるのですが、同じ回路をブレッドボードやユニバーサル基板に実装するとなると、2.54mmピッチでない部品は実装が面倒になります。
ピッチを変更するための変換基板が市販されているのでこれを使う方法もあるのですが、どうせなら2.54mmピッチの「USB-シリアル変換モジュール」を使用して、ついでに3.3V電源もこのモジュールから供給してもらう、というのが今回の自作マイコンボードの方針です。

この方針でさっきの回路図を書き直したのが、次の2つの回路図です。
見やすいように不要な部品、配線を回路図から削除したのでかなりすっきりしています。

【自作マイコンボード回路図(1/2)】
※本回路図は2021年4月14日に変更しました。U1の11PINはGNDに接続、X1の2PINはGNDに接続、U1の6PINはBR1の4PINに接続、であることにご注意ください。
回路図(1/2)で3V3と表記された上向き矢印(4箇所)は電源の3.3Vのことで、回路図(2/2)の3V3に接続します。
また、回路図(1/2)で下向きの▽印(4箇所)は電源のグランドのことで、回路図(2/2)のGNDに接続します。
信号ラインは送信(TXD)と受信(RXD)を繋ぐので、
回路図(1/2)のTXDを回路図(2/2)のRXDに接続、回路図(1/2)のRXDを回路図(2/2)のTXDに接続します。

【自作マイコンボード回路図(2/2)】


ここで、まだ説明していない部品の説明をしておきます。

X1は4MHzのセラミック発振子を使っています。
このマイコンはもっと高い周波数で動作させることができるのですが、ROM書き込み時の都合でこの周波数にしています。

SW5は2回路が同時に切り替わるスイッチで、ROM書き込み時の配線とマイクロBASIC動作時の配線をこれで切り替えます。
機械的なスイッチの中を、通信用の電気信号を流すというあまりお行儀の良くない回路だということは覚えておいてください。(ホビー用途ならまあいいか、みたいな感じです。)
スイッチの入手が困難なら、1回路のスイッチを2個並べて同時操作してもかまいません。
なお、SW5に接続されたダイオードD1の周辺は、資料「Z8 Encore! XP F64xx Series Product Specification (PS0199)」の195ページの回路と同じです。

SW1、SW3とLED1は、後でROMに書き込むファームウェア(プログラム)が、電源投入時やリセット直後の動作モード決定、起動時のLED点滅表示に使用します。
起動後は、通常の入出デバイスとしてユーザプログラムで自由に使ってかまいません。

回路図で使用する部品を表に示します。
No. 部品 記号 数量 品番 メーカ 仕様 備考
1 eZ8CPU(マイコン) U1 1 Z8F6421PM020SG ZILOG eZ8,64KROM,4KRAM,3.3V電源
2 振動子 X1 1 CSTLS4M00G53-B0 MURATA 4MHz 同等品で代用可
3 変換モジュール U2 1 UMFT230XA-02 FTDI USB-3.3Vシリアル変換器,3.3V電源出力付
4 LED LED1 1



5 抵抗 R2 1

330Ω
6 タクトスイッチ SW1,SW3,SW6 3



7 集合抵抗 BR1 1

10kΩx8 10kΩx4で代用可
8 スライドスイッチ SW5 1

2回路2接点 スイッチ2個で代用可
9 ダイオード D1 1

400mA,100V以上
10 抵抗 R3 1

10kΩ
11 抵抗 R4,R5,R6 3

68Ω

No.1、No.3以外は、秋葉原などの電気街か通販で容易に入手可能かと思います。
No.1,No.3は、購入先が限られます。(*1)(*2)
No.3は類似製品なら比較的簡単に入手できますが、電気特性、ピン配置などに応じて回路を変更してください。

さて、部品が揃ったら組立てます。
写真は、ブレッドボードにマイコンと変換モジュールを取り付けて、ボードの電源配線のみおこなった状態です。
電源電圧をテスターで測ったところ3.17Vを示しました。一応、変換モジュールの電源は動いているみたいです。


部品極性、ピン配置などが解らない場合はデータシートを入手して確認してください。
マイコンボード自作編は私も並行して組立ててゆきますので、組立途中で問題が見つかり回路を変更するかも知れません。

・・・とか言っているうちに、マイコンボードが完成しました。

※写真は2021年3月31日時点のもので、最終回路とは若干異なります。

このボードをパソコンに接続してROM書込ソフトを走らせると、OCD(オンチップデバッガ)のレビジョン“01.22"を表示しました。


このレビジョンは、マイコンに内蔵されているOCDが通信でパソコンに伝えた情報です。
パソコンとマイコンボードは正しく通信しているみたいです。
なお、ROM書込ソフトの操作手順を間違えると正しく応答しません。(無応答とか、レビジョン“00.00とか)
次回、詳しく説明いたします。

次回は、ファームウェアをアセンブルして、マイコンの内蔵ROMに書き込んだ後、マイクロBASICを起動させる予定です。
--------------------
(*1)2021年3月時点の入手可能な購入先です。(ネット検索調べ)
Z8F6421PM020SG・・・Digi-Key(https://www.digikey.jp/)、MISUMI ECサイト(https://jp.misumi-ec.com/)、Mouser Electronics(https://www.mouser.jp/)
UMFT230XA-02・・・Digi-Key(https://www.digikey.jp/)、Mouser Electronics(https://www.mouser.jp/)
(*2)2022年5月、ショップ(ベイス)で、ファームウェア書込済のZ8F6421PM020Sの取り扱いを開始しました。商品名は「ZCPU1用マイコン単品 ZCPU1/P」です。

■第3回 ファームウェアの書込、マイクロBASICの実行(2021/04/21掲載,2021/06/29最終変更)
さて、今回はファームウェアをアセンブルして、マイコンの内蔵ROMに書き込んだ後、マイクロBASICを起動させるところまで進めます。

まず、このマイコンのアドレスマップを見ておきます。
RAMとROMはそれぞれ別のアドレス空間にあり、例えばRAM10H番地とROMの10H番地はそれぞれ別のアドレスのメモリです。
どちらも、1番地あたりのメモリ容量は1バイト(8ビット)です。
今回は、ファームウェアをROMアドレスの0H番地~0FFFH番地の範囲に書き込みます。

書き込み後のROM、RAMの各アドレスの使用用途は次の通りです。
RAMアドレスの100H~EFFHを、マイクロBASICのプログラムと配列変数に使っています。

では、アドレスマップがイメージできたところで実際の作業に取りかかります。

【手順1】ファームウェアをアセンブル
(1)このページの先頭にある記事中のプログラム・資料から次の2つのファイル (*1)をダウンロードして、解凍します。
        eZ8アセンブラ開発ツール集 Vol.1 (tools1b.zip)
        Micro BASIC for ZCPU1 Version1.02 (os_basic102a.zip)
(2)解凍して生成されたアセンブラ(zasmb20.exe)と同じフォルダ内に、ファームウェアのソース(os_basic102.asm)をコピー後、アセンブラを実行(ダブルクリック)します。(*2)
コマンドプロンプト上で「Sorce file name?(*.ASM or *.INC)」と聞いてきたら「os_basic102.asm」を入力(キーイン)します。
アセンブルが終了するとコマンドプロンプトが閉じます。
この時点でフォルダ内に、オブジェクトファイル(OS_BASIC102.OJ1)とリスティングファイル(OS_BASIC102.LST)が生成されているはずです。

【手順2】ROM書き込みアドレス、ページ範囲の確認
(1)テキストエディタで、生成されたリスティングファイル(OS_BASIC102.LST)を開きます。
(2)リストの左端のアドレスを見て、今回のROM書き込みアドレス範囲を確認します。
このリストでは0H番地からD04H番地です。


(3)次にこの0H番地からD04H番地が、ROMのどのページ範囲かを確認します。
1ページ=512番地なので、今回のプログラムは00H~06Hページの範囲になりますが、区切りの良いところで
00H~07Hページとしてメモっておきます。
この情報(ページ範囲)は、後でROM消去に使います。


【手順3】COMポート番号の確認(*3)
(1)Windowsが起動した状態のパソコンで、Windowsキーを押しながら✕キーを押します。
(2)メニューが表示されたら、その中のデバイスマネージャーを選択します。
(3)デバイスマネージャーのウィンドウが開くので、その中の「ポート(COMとLPT)」をダブルクリックして現在使用されているCOMポートを表示させます。
(4)この状態でパソコンとマイコンボード上の変換モジュールをUSBケーブルで接続すると、現在使用されているCOMポートが1個増えます。(*6)
このCOMポート番号(COM□)をメモったら、マイコンボード上の変換モジュール側のUSBケーブルを外しておきます。

【手順4】ROM消去(*4)
(1)マイコンボード上の変換モジュール側のUSBケーブルが外れていることを念のため確認します。
(2)マイコンボード上のスイッチSW5の状態を、図のように
RWR側(RomWRiter側)にします。

(3)ROM書込ソフト(zromw20.exe)を実行(ダブルクリック)すると、コマンドプロンプト上でROM書き込みソフトが立ち上がります。
「COM Port number?(1-99)」と聞いてきますが、この時点では放置しておきます。
(4)次に、マイコンボード上の変換モジュール側のUSBケーブルを接続します。
(6)ここで、【手順3】でメモっておいたCOMポート番号(この図では6)を入力します。


OCD(オンチップデバッガ)のレビジョン(この図では01.22)を表示すれば接続成功です。
このレビジョンは、マイコン(LSI)に内蔵されているOCDが通信でパソコンに伝えた情報です。
なお、手順4の操作手順が順番通りでないと、正しく応答しない場合があります。(無応答とか、レビジョン“00.00とか)
(7)Enterキーを押すと、ROM書込ソフトのコマンド一覧が表示されます。


(8)ここで試しに、ROMの00Hページを消去しようとして"e"を入力しても「Canceled」と表示してコマンドを受け付けません。
これは、ROM書込ソフトがファームウェア(ROMの0H~FFFH番地、ページでいうと00H~07Hページ)を誤って上書きしないように制限しているためです。
今回はファームウェアを書き込むので、この制限を一時的に解除する必要があります。
そこで、コマンド待ちの状態で
半角で”SEIGENKAIJO”と入力します。(もし、ここで「*** SEIGENKAIJO ***」と応答しなければタイプミスしています!)
今度は"e"コマンドでROMの00Hページ(0H~1FFH番地)が消去できました。
同様の操作で、手順2の(3)でメモっておいたページ範囲(00H~07H)を消去します。
確認のため"r"コマンドでROMの0H番地から1000H番地分のデータを表示すると、すべてFFHであることがわります。
なお、市販のマイコン(LSI)は初期状態で消去されているみたいなのですが、習慣としてROMに書き込む前に消去しておくことをお奨めします。

【手順5】ファームウェア書込
(1)ROM書込ソフト(zromw20.exe)と同じフォルダ内に、アセンブルで生成されたオブジェクトファイル(OS_BASIC102.OJ1)があることを念のため確認します。
(2)ROM書込ソフトの”w”コマンドを実行します。
「Object file name?」と聞いてきたら、手順1で生成された「OS_BASIC102.OJ1」を入力(キーイン)します。
画面に書込データがスクロール表示され、最後に「Ready」と表示されれば書込成功です。
確認のため"r"コマンドでROMの0H番地からE00H番地分のデータを表示すると、書きこんだデータが表示されます。
ROM書き込みソフトを”q”コマンドで終了させ、マイコンボード上の変換モジュール側のUSBケーブルを外しておきます。

【手順6】マイクロBASICの起動
(1)SW5を
NRM側(NoRMal側)にして、USBケーブルを接続してターミナルソフト(ZTERM20.exe)を動作させて、COMポート番号を入力します。
(2)マイクロBASICを起動させるには、
SW1とSW3を押下した状態で起動(電源を投入か、RESETスイッチ(SW6)をクリックします。
(3)マイコンボード上のLED1が数秒点滅後
mBASIC 1.02
OK

と表示されればマイクロBASICが無事起動しています。
試しに
10 "HELLO WORLD"
20 #=10
#=1

と入力すると、"HELLO WORLD"を繰り返し表示するはずです。
表示を止めるには、ESCキーを何回か押してください。
それから、BASICの「LIST」と「NEW」は、マイクロBASICでは「0」と「&=264」です。

この時点で、自作マイコンボードは完成です。
「eZ8アセンブラ開発ツール集 Vol.1 (tools1b.zip)」の中にある
「doc1e.pdf 取扱説明書(第6版)」の第3章にマイクロBASICの文法の説明がありますので、ぜひご一読ください。
また、本ホームぺ―ジのマイクロBASICによる数値計算とゲームからいくつかのプログラムがダウンロードできます。ターミナルソフト(ZTERM20.exe)は、チルダ(~)キーを押すことでBASICプログラムをファイルにセーブ、ロードすることができるので、ダウンロードしたプログラムをロードして実行することができます。

くどいようですが「SW5はNRM側、SW1とSW3を押下した状態で起動(電源を投入か、RESETスイッチをクリック)をお忘れなく。f(^_^; (*5)
それから、この連載の途中で「自作マイコンボード回路図(1/2)」を変更していますので、次の通り配線されているかをご確認ください。
U1の11PINはGNDに接続、X1の2PINはGNDに接続、U1の6PINはBR1の4PINに接続

次回は、アセンブラでプログラムを作って実行させてみます。

--------------------
(*1)2021年4月時点のファイル名です。今後ファイルが変更された場合は、以降の説明のバージョン番号などは適宜、読み替えてください。
(*2)ダウンロード後、最初の1回目の起動で「PC が危険にさらされる可能性があります」と警告が出たら「詳細」から「実行」をクリックしてください。
不安な方は、ダウンロードしたファイルをWindows Defenderでスキャンして、ファイルの安全性をチックしてください。
(*3)「USBケーブルで接続するのになぜCOMポート?」と思った人は、本ページ「機械語プログラミング編 第4回 送受信サブルーチン」を見てください。
(*4)ROM書き込みは、各ビットを1から0にしか書き換えることしかできないため、ROM書き込み前にすべてのビットを1に書き換えておく処理(ROM消去)が必要です。
(*5) このスイッチ操作を間違って起動すると、フリーズしたり、キーボード入力が誤動作するなどの現象が発生します。
私も時々このことを忘れて、何で動かないのか悩んでます。
(*6)デバイスドライバがWindowsにインストールされていない場合、COMポートが増えません。
この場合、FTDI社の仮想COMポートドライバのページ(https://ftdichip.com/drivers/vcp-drivers/)からWindows版のドライバーをパソコンにダウンロード、解凍し、下図赤枠の手順でインストールしてください。


■第4回 アセンブリ言語プログラムの作成と実行(2021/06/28掲載,2021/06/30最終変更)
今回は、アセンブリ言語でプログラミングを行い、アセンブル、ROM書き込み後、書き込んだ機械語プログラムを実行してみます。

ROMに書き込まれているファームウェアを消去して代わりに機械語プログラムを書き込んでもよいのですが、今回はファームウェアと機械語プログラムを共存させて、マイクロBASICから機械語プログラムを呼び出すことにします。
マイクロBASICから機械語プログラムを呼び出すには、変数(>)に機械語プログラムの実行開始番地を代入します。
たとえばマイクロBASICで
>=4096
を実行すると、ROMの4096番地(1000H番地)に書いてある機械語プログラムを実行し、機械語のRET命令実行で、マイクロBASICに戻ってきます。(*1)
このマイクロBASICの仕組みは、下のファームウェアのソースの該当部分(赤字)を見て、ざっくりと納得してください。
'例外処理(左辺変数が">"のとき)
:L3606
         CP :VNM,#:CH_GT       '左辺変数が">"か?
         JR /NE,:L3605
         LD 0,:MODL                 '変数%の下位バイト→r0
         LD 1,:MOD                   '変数%の上位バイト→r1
       
 CALL @:LR                  '右辺の値をアドレスとする機械語サブルーチンをコール
         LD :MODL,0                 'r0→変数%の下位バイト
         LD :MOD,1                   'r1→変数%の上位バイト
         JR :L3605

今回作成するプログラムでは、ファームウェアのシステムコールを使います。
システムコールには次のものがありますが、今回製作した互換ボードではEEPROMがないのでLOADとSAVEは使用できません。


以上が、今回必要な予備知識です。
では、例題のプログラム仕様を示し、そのプログラム作成、アセンブル、書込、実行まで行ってみます。

【プログラム仕様】
マイコンボードに接続されたターミナルから1桁の数字(1~9)をキー入力すると、その数字の回数だけマイコンボード上のLEDが点灯します。
0または数字以外をキー入力するとプログラムを終了します。
このプログラムは、マイコン内蔵ROMの1000H番地以降に書き込んで実行します。

【プログラム作成】
このプログラム仕様通り、アセンブリ言語で記述してみました。
なお、ここでは説明のためソースではなく、ソースをアセンブルしたリスティングファイル(prg1.lst)で表記しています。
ソース入力が面倒な方は、ここからダウンロードしてください。(prg1.asm)



プログラムは見ての通りですが、一応記号①~⑧の部分を簡単に説明しておきます。(不要な方は読み飛ばしてください)

①リスティングファイルを掲載したため、ここにアセンブル結果(ROMアドレスと機械語コード)が表示されています。これはソースプログラムには存在しません。
②ソースプログラムの先頭で、プログラムを読み易くするため、プログラム中で使用する文字コードとROMアドレスにラベル(文字列)を割り当てています。
アセンブラ(ZASMB!)の規則により、ラベルの先頭に(:)を付けています。
③ORG疑似命令で、次の行からのソースプログラムを1000H番地から機械語コードに変換するようアセンブラに伝えています。
左側を見ると、確かに1000H番地から機械語コードが始まっています。
ここでは、まず最初にマイコンの出力ポートPC6に1(≒電圧3.3V)を書き込みLEDを消灯させています。(【自作マイコンボード回路図(1/2)】を参照ください)
④ファームウェアのシステムコールOUT1C(3BH)を使って、文字"?"をターミナルに出力しています。
コール前にレジスタr0に出力する文字のASCIIコードを入れています。
⑤ファームウェアのシステムコールINP1C(3EH)を使って、ターミナルから入力された1文字を取得しています。
リターン後にレジスタr0には入力された文字のASCIIコードが入っています。
⑤レジスタr0に入っている文字が”1"~"9"の範囲かを調べ、結果により分岐しています。
ファームウェアで(SRP #%00)を実行しているため、r0の代わりに0番地のメモリと比較しています。←わからない方は、機械語プログラミング編の第3回を見て(ね)
⑦入力された文字”1"~"9"はASCIIコードで31H~39Hなので、ここから30H(:CH_0)を引いて数値1~9に変換しています。
⑧マイコンの出力ポートPC6に0と1を交互に書き込み、LEDを点灯/消灯させています。
点灯/消灯の切り替えごとにシステムコールT100MS(50H)を3回実行しているため、約0.3秒ごとの点滅表示となります。

【アセンブル、ROM書込】
ソースファイルを入手(あるいは入力)したところで、アセンブル、ROM書込の作業に移ります。
まず、ソースファイル(prg1.asm)をアセンブルして、prg1.lst、prg1.oj1を生成します。


生成したリスティングファイル(prg1.lst)を開いて、機械語コードのアドレス範囲(1000H~104EH番地)からROM消去対象がページ(08H)であることを把握します。(*1)

以下、ROM書込ソフトZROMW!を起動し、次の操作を行います。


特に、難しいところはありませんが、うっかりするとスイッチの位置を間違えますので注意ください。
なお、今回書き込むアドレスはファームウェアのエリアではないので「制限解除」しなくても消去、書込可能です。

【実行】
書込が終了したら、いったんマイコンボードの電源を落として、マイクロBASICの動作環境にします。
従来と違うのは、ROMの1000H番地に機械語サブルーチンが書き込まれている点だけです。
では、マイクロBASICでこの機械語サブルーチンを呼び出すプログラムを作成、実行してみます。


ここでは、まず
100 >=4096
という行番号100のプログラムを1行作成し、実行(#=1)しています。
すると、コンソールに(?)を表示したため、1回目は3、2回目は5を入力し、それぞれ3回、5回LEDが点滅することを確認しています。
3回目に0を入力すると機械語サブルーチンからマイクロBASICに制御が戻りますが、マイクロBASICが1行のプログラムなので実行終了し、OK表示しています。
うまく動いたでしょうか?

さて、これで4回に渡った「マイコンボード自作編」を一応終了いたします。
ここまで読んで下さった方、あるいは実際に製作して動かして下さった方がいらっしゃれば、この場をお借りし御礼申し上げます。

では、またいつか、どこかでお会いしましょう。

--------------------
(*1)VTL(Very Tiny Language)の機械語サブルーチン呼び出しとは仕様が異なるので注意ください。
(*2)原因不明ですが、最初1000H番地以降(ページ08H)を消去せずに、ROM書き込みを行いましたが書き込みできませんでした。
念のため、ROM書込前に書込対象のページは消去しておくことをお奨めします。


このソフトウェアに関するご意見・ご質問等をお待ちしています。
to@takami.com  (アドレスは半角で入力ください)

[トップページに戻る]

eZ8マイコンボードの自作 (旧Z8 Encore!機械語プログラミング)