ザイログのマイコンZ8 Encore!の機械語プログラミング、および市販部品を集めて作るマイコンボードの自作方法について解説します。
初めて訪れる方は「ごあいさつ」からご覧ください。

※本記事中で使用するプログラム・資料はここからダウンロードできます。
本記事に表記してあるプログラム・資料と同じバージョン(Ver□、第□版)が見つからない場合は、最新版をダウンロードしてください。

------------------------------------------------------------
目次
------------------------------------------------------------

ごあいさつ
--- 機械語プログラミング編 ---
第1回 ハードウェア概要と開発環境
第2回 電源投入からのプログラム実行まで
第3回 プログラム実行で最初に行うこと
第4回 送受信サブルーチン
第5回 パラレルポートの入出力
第6回 eZ8CPU命令(1)
第7回 eZ8CPU命令(2)

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

--- 続マイコンボード自作編 ---
はじめに
第1回 代替マイコン「Z8F6481QN024XK」の検証(1)
第2回 代替マイコン「Z8F6481QN024XK」の検証(2)
第3回 代替マイコン第二弾「Z8F6421VN020SG」の検証(1)
第4回 代替マイコン第二弾「Z8F6421VN020SG」の検証(2)、まとめ
第5回 代替USB-シリアル変換モジュール「LC231X」の検証(1)
第6回 代替USB-シリアル変換モジュール「LC231X」の検証(2)

--- 機械語アプリケーション開発編 ---
第1回 ROMディレクトリ機能(1)
第2回 ROMディレクトリ機能(2)

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

本ページは2021年2月「eZ8マイコンボードの自作」と名称変更しました。
従来の内容は「機械語プログラミング編」となり、 今後は主に「マイコンボード自作編」の方で市販部品を集めてマイコンボードを製作する解説を行ってゆきます。
はじめてマイコンを体験する方にとってはかなり難しい作業となりますが、この作業には小規模ながらハードウェア製作から、機械語、高級言語までのプロセスが含まれています。
興味のある方は是非チャレンジしてみてください。

なお、2023年時点で、マイコン(Z8F6421PM020SG)など一部の部品の入手が難しくなってきました。(*3)(*4)
そこで、代替部品で何とかしようという奮戦記が「続マイコンボード自作編」です。

最後の「機械語アプリケーション編」は、ZCPU1シリーズ、ZCPU3シリーズとその互換ボード上で走る「機械語アプリケーション」の開発をおこなってゆきます。

では、始めます。
--------------------
(*1)厳密には、Z8 Encore!(R)、Z8 Encore! XP(R)、Z8 Encore! MC(TM)の3種類(無印、XP、MC)があり、このうちのXPです。
(*2)ザイログ社から直接購入か、Digi-Key(http://www.digikey.jp/)から購入可能かと思います。
(*3)趣味で数個単位で購入しようとする場合の話です。
(*4)宣伝で恐縮ですが、タカミコムボードからファームウェア書込済のマイコン(Z8F6421PM020SG)を購入できます。(2023年6月時点)

------------------------------------------------------------
機械語プログラミング編
------------------------------------------------------------

第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掲載,2023/07/01最終変更)
今回はパラレルポートの入出力について見てみます。
パラレルポートは処理が単純(というよりは通信の約束事(プロトコル)をソフトウェアに任せているためマイコンが面倒を見ないという意味で単純) で す。
すでに初期設定(リスト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)

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


図 マイコンキットの回路図(抜粋)
※本回路図は2023年7月1日に訂正しました。U1の35PINの信号名は「PA7/SDA」であることにご注意ください。
 
回路図を見るとスイッチ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掲載,2023/07/01最終変更)
今回は、ジャンプ命令・ビット操作命令について解説します。

下表は、資料「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掲載,2023/07/01最終変更)
ここからは、実際にマイコンボードを自作する解説になります。

図 自作マイコンボード

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

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

次に、完成した自作マイコンボードに対して、キーボードで指示を与え、結果をディスプレイに表示するための端末装置(ターミナル)について説明します。
これは、Windowsパソコンにターミナルソフトを走らせて、これを端末装置の代用とします。
当初、このパソコンとマイコンボードとの接続ケーブルにはキットと同じく「USB-シリアル変換ケーブル」を使用する予定でした。
後で説明する資料(eZ8アセンブラ開発ツール集 Vol.1 )も、この方法による回路図(henko-kairo.bmp henko-kairo.pdf ZCPU1回路図.pdf、ZCPU1回路図(解説付).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掲載,2023/07/01最終変更)
今回は、部品を入手してボードの組立までを説明したいと思います。

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


図 ZCPU1回路図(解説付)
※本回路図は2023年7月1日に訂正しました。U1の35PINの信号名は「PA7/SDA」であることにご注意ください。

この回路図の赤字の説明の通り製作してパソコンと「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に接続」であることにご注意ください。
※本回路図は2023年7月1日に訂正しました。「U1の35PINの信号名はPA7/SDA」であることにご注意ください。

回路図(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を示しました。一応、変換モジュールの電源は動いているみたいです。

図 自作マイコンボード(組立途中)

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

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

図 自作マイコンボード(完成時)

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

図 ROM書込ソフトを起動

このレビジョンは、マイコンに内蔵されている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掲載,2023/07/01最終変更)
さて、今回はファームウェアをアセンブルして、マイコンの内蔵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消去に使います。

図 ROMページと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側)にします。

図 スイッチSW5の状態(RWR側)

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

図 ROM書込ソフトを起動

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

表 ROM書込ソフトのコマンド一覧

(7)ここで試しに、ROMの00Hページを消去しようとして"e"を入力後"00"を指定しても「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)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掲載,2023/07/01最終変更)
今回は、アセンブリ言語でプログラミングを行い、アセンブル、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は使用できません。

表 システムコール ※Ver1.03からシステムコール68h~95hが追加されています。

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

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

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


図 例題のプログラムのリスティングファイル(prg1.lst)

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

①リスティングファイルを掲載したため、ここにアセンブル結果(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!を起動し、次の操作を行います。

図 ROM書込ソフトで、ROM消去、プログラム書込、書込結果を確認

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

【実行】
書込が終了したら、いったんマイコンボードの電源を落として、マイクロ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書込前に書込対象のページは消去しておくことをお奨めします。


------------------------------------------------------------
マイコンボード自作編
------------------------------------------------------------

はじめに(2023/05/24掲載,2023/08/27最終変更)
本編は、タイトルの通り「マイコンボード自作編」の続編です。
「自作編」では、2021年当時、個人でも入手可能だった
40ピンDIP形状のZ8F6421PM020SGを採用しました。
しかし、2年経った現在、このマイコンを個人で入手することが難しくなってしまいました。

そこで、代替マイコンで自作しようと最初に目を付けたのが、
44ピンQFN形状のZ8F6481QN024XKです。
残念ながら、このマイコンは技術的および実装のコスト的な理由で採用を断念しました。(詳しくは、第1回~第2回をご覧ください)

そして、次に目を付けたマイコンが、
44ピンPLCC形状のZ8F6421VN020SGです。
このマイコンは、Z8F6421PM020SGと機能面での類似性から、代替マイコンとして有力と考えられます。
「続マイコンボード自作編」の第3回~第4回は、このZ8F6421VN020SGの製作記事となります。

また、第5回~第6回は、生産中止になっているUSB-シリアル変換モジュールUMFT230XA-02の代替品
LC231Xの動作確認記事です。

図 マイコンの種類

第1回 代替マイコン「Z8F6481QN024XK」の検証(1)(2023/05/14掲載,2023/09/03最終変更) ※記載内容を大幅に変更(2023/06/11) ※タイトルを変更(2023/08/27)
お久しぶりです。
ちょうど2年前の今頃、Zilogの8ビットマイコンを使ったマイクロBASICが走る自作マイコンボード(写真)の記事を掲載していましたが、今回はその続編です。

図 「マイコンボード自作編」で製作したマイコンボード(右の40ピンICがマイコン)

「マイコンボード自作編」で使用したマイコン(Z8F6421PM020SG)は
・DIP40ピンパッケージなのでブレッドボード、ユニバーサル基板上で配線可能
・ROM書込機能が内蔵
・マイクロコントローラにしては大容量(?)の4KBのRAM
というの特徴があり、手軽に自作するには最適でした。

当時このマイコンは個人でも入手可能で、部品を買い集めて作ることを前提にしていたのですが、2年経った現在、個人で入手することが難しくなっています。(*1)
そのため2年前の自作マイコンボードの記事が、現在は事実上製作不可能になっています。
私自身も、今後このマイコンを入手することを諦めかけていたのですが、最近このマイコンと同じCPUコア(eZ8)内蔵のF6482シリーズがあることを知り、このマイコンで何とか自作マイコンボードの記事を復活できないかというのが、今回の「続マイコンボード自作編」の目的です。

もっと具体的に言うと、最近回路図とファームウェアを公開した
ZCPU3という「前回の自作マイコンボードから部品、配線を削減した最小構成のマイコンシステム」があるので、これに対して、マイコンをF6482シリーズのZ8F6481QN024XKに置き換えて、必要ならマイコンに書き込むファームウェアも改造します。

図 自作のZCPU3システム(マイコンの上のスイッチが無い)

今後の作業は、次のステップで進める予定です。

(ステップ1)技術情報、ソフトウェアを入手
(ステップ2)回路改造内容、実装方法を検討
(ステップ3)マイコンをZ8F6481QN024XKに交換
(ステップ4)必要ならファームウェアを改造、アセンブル後、ROMに書込
(ステップ5)マイクロBASICを実行

今回はステップ2の途中まで進めます。

では、技術情報、ソフトウェアを入手しましょう。
次の4個のファイルをダウンロードして(解凍して)ください。

(1)eZ8アセンブラ開発ツール集 Vol.1(
d) ←ZCPU3の回路図(部品表含む)はここにあります
(2)Micro BASIC for ZCPU
3 Version1.01 ←ZCPU3のファームウェアです
(3)eZ8 CPU Core User Manual(UM0
128)
(4)F6482 Series General-Purpose Flash Microcontroller Product Specification(PS0
294)

ここで(1)(2)は、本ページの先頭からダウンロードできます。
(3)(4)はZilogのホームページからダウンロードしてください。
ダウンロード方法は次の通りです。
【手順1】Zilogサイトのトップページ(www.zilog.com/)へ行きます。
【手順2】画面上部にあるメニューからTools and SoftwareのDocumentationを選択し、Documentationページへ移動します。
【手順3】画面左にあるツリーからMicrocontrollersのEncore! のZ8 Encore! XPのZ8F64
81を選択します。
【手順4】現在表示しているリストがマイコンZ8F6481に関する技術情報となります。リストをスクロールし、必要なドキュメント(UM0128、PS0294)を見つけてクリックします。

では、資料を入手したところで、ZCPU3の回路図を見てみましょう。

図 ZCPU3回路図(USB-シリアル変換モジュール部分を除く)

ZCPU3システムのU1には、40ピンDIP形状のマイコンZ8F6421PM020SGが使われていて、その内蔵ROMにはZCPU3シリーズのファームウェアが書き込まれています。
今回の改造では、U1のマイコンを44ピンQFN形状のZ8F6481QN024XKに変更します。
このマイコンは、従来のマイコンとピン数、ピン形状、ピンの名称が異なるものの大半は類似のピンがあるため、そのピンで代用すればもしかして動くのではないかと期待しています。

ただ、注意しなければいけない点があります。
どちらのマイコンも1つのピンでGPIO(普通のI/O、回路図でP□0~P□7)と特殊機能のI/Oを兼用しています。
各ピンをどちらのI/Oとして使うかは電源投入直後に実行するファームウエアで決定しますが、もしこの兼用の組み合わせがZ8F6421PM020SGとZ8F6481QN024XKで異なると、ファームウェアを書き換える必要があるかもしれません。
これは、次回検討します。

また、実装上の問題があります。
今回採用したマイコンは44ピンQFN形状なのですが、これをどうやってDIP配列に変換してブレッドボードやユニバーサル基板に差せるようにするかです。
QFP形状なら市販の変換基板を入手して、難しいながらも手はんだか、ホットプレートでリフローできる可能性があったのですが、今回購入したQFN形状では事実上不可能です。
ここはあっさり諦めて、高価な「QFN-DIP変換アダププタ」を発注することにしました。(機能だけで部品選定したツケが回ってきました)
実装の難易度とコスト面から考えると、簡単で安い方から順に
Z8F6421
PM020SG(DIP形状) < Z8F6421VN020SG(PLCC形状) < Z8F6481AN024XK(LQFP形状) < Z8F6481QN024XK(QFN形状)
になるかと思います。
もし、F6482 Seriesのマイコンを使って自作するのであれば、QFN形状ではなくLQFP形状を検討してみてください。(マニュアルを見る限り、同じピン配列みたいです)
PLCC形状のZ8F6421VN020SGであれば、さらに簡単に実装できるかと思います。
(*3)
今回はここまでです。
「QFN-DIP変換アダププタ」が届いたら、再開します。
--------------------
(*1)宣伝で恐縮ですが、タカミコムボードからファームウェア書込済のマイコン(Z8F6421PM020SG)を購入できます。(2023年5月時点)
このファームウェアはROM書込ソフトで変更可能です。(念のため!)
(*2)ピン名称については、ダウンロードした資料PS0294の14ページに図がありますので、それを見てください。
(*3)消した理由は、第2回の記事をご覧ください。

第2回 代替マイコン「Z8F6481QN024XK」の検証(2)(2023/06/26掲載,2023/08/27最終変更) ※タイトルを変更(2023/08/27)
通販で注文していた「QFN-DIP変換アダププタ」が届きました。(*1)
写真は変換アダププタにマイコンを取り付けた状態(蓋は開けたまま)です。
真ん中のマイコンZ8F6481QN024XKは、マーク位置から反時計周りに1ピン~44ピンとなります。
この変換アダプタを何箇所かテスターで導通を調べたところ、マイコンのピン番号と変換基板のDIP配列のピン番号(=基板両端のシルク印刷)とが一致して、助かりました。
これで、マイコンをブレッドボードを使って配線できる目途が立ちました。

図 QFN-DIP変換アダププタ(中央はマイコンZ8F6481QN024XK)

さて、前回説明した通り、今回の改造ではZCPU3回路図のU1のマイコンを、44ピンQFN形状のZ8F6481QN024XKに置き換えます。
そこで、ZCPU3回路図のマイコンのピンと同じ機能名を含むZ8F6481QN024XKのピンを調べて、その対応を図示してみました。(電源ピンは省略)

図 ZCPU3回路図のマイコン(Z8F6421PM020SG)のピンとZ8F6481QN024XKのピンの対応

図を見ると、ZCPU3回路図で使用する「ピン機能」の範囲では、Z8F6481QN024XKにも同じ名前の「ピン機能」のピンあることがわかります。
しかも、ROM書込時の通信に使うDBGピンは、どちらのマイコンも専用ピンです。
マイクロBASIC時の通信に使うRXD0、TDX0は、どちらのマイコンもRXD0がPA4と兼用、TXD0がPA5と兼用です。(厳密にはZ8F6481QN024XKではMOSI0、SCK0とも兼用)
もしかすると、ZCPU3のファームウェアがそのまま使えるかもしれません。

ということで、ZCPU3のボードを改造してみました。
具体的には、ZCPU3のボードからマイコンZ8F6421PM020SGを取り外し、代わりにボードの裏側に取り付けたマイコンZ8F6481QN024XKから配線を引き出し、元々あったマイコンの対応するするピン番号位置に接続します。(電源ピンも配線)

図 ZCPU3のボードからマイコンを取り外し、裏側からZ8F6481QN024XKを配線

では、この改造ボードで、まずZCPU3のファームウェアを書き込んでみます。
図はROM書込ソフトの操作画面ですが、最初にマイコンは内蔵しているOCDのRevisionを「01.39」とそれらしい値をROM書込ソフトに返しています。
あくまでも推測ですが、マイコンのクロックは正常動作していると思われます。
しかし、その次のConnected to の後に本当は「Z8F6481QN024XK」という応答を期待していたのですが、表示されませんでした。(上側の黄色部分)
とりあえずそのまま作業を進めたところ、e(erase)コマンドで「*」記号を連続出力してきた(下側の黄色部分)ため、途中で打ち切りました。

図 ROM書込ソフトの操作画面(途中で打ち切り)

どうも、現状のROM書込ソフトでは、Z8F6481QN024XKに書込できないようです。(*2)(*3)

原因を調査してROM書込ソフトを改造すれば、書き込めるようになるかも知れません。
ただ、ROM書込ができるようになったとしても、以前説明した通り、このマイコンは自作レベルでは高価なQFN-DIP変換アダププタを使わざるを得ず、メリットが感じられません。
ということで、今回で
Z8F6481QN024XKの自作は中断することにしました。
Z8F6481QN024XKで自作マイコンを検討していた方には誠に申し訳けございません。

「続マイコンボード自作編」の第3回目からは心機一転、Z8F6421
VN020SGを試してみます。
このマイコンは、ZCPU1、ZCPU3で採用しているZ8F6421PM020SGと同じシリーズのマイコンなので、恐らく動かせると期待しています。

懲りずに、次回に続きます。
--------------------
(*1)市場には「44ピンQFN→
44ピンDIP変換アダプタ」と「44ピンQFN→40ピンDIP変換アダプタ」の2種類があるようです。
今回は「44ピンQFN→
44ピンDIP変換アダプタ」で、できるだけ安価な物という条件でを探した結果、AliExpress(中国の通販サイト)から購入しました。
それでも購入価格は約¥8,000でした。
(*2)このROM書込ソフトは、開発当時、ZCPU1のマイコンZ8F6421PM020SGへのROM書込用に作ったものです。
Z8F6481QN024XKへの書込は考慮(検討)していませんから、書込できなくても、仕方ないと言えます。
(*3)試していませんが、Z8F6481AN024XK(LQFP形状)でも同じ現象が発生するかも知れません。

第3回 代替マイコン第二弾「Z8F6421VN020SG」の検証(1)(2023/07/02掲載,2023/08/27最終変更) ※タイトルを変更(2023/08/27)
前回アナウンスの通り、今回から
44ピンPLCC形状のZ8F6421VN020SGを試してみます。
このマイコンもZ8F6481QN024XKと同じく面実装部品なのですが、部品サイズが大きいので「変換基板」あるいは「ソケットの足が2.54mmピッチの(でもDIP配列じゃない)PLCC用ICソケット」を使って半田付けが可能です。
ここでは個人的な好みで半田付けの不要な「PLCC-DIP変換アダププタ」を使ってブレッドボード上で配線することにします。

写真は変換アダププタにマイコンを取り付けた状態です。

図 PLCC-DIP変換アダププタ(中央はマイコンZ8F6421VN020SG)

Z8F6421VN020SGは、上段の中央のピンから反時計周りに1ピン~44ピンとなります。
この変換アダプタを何箇所かテスターで導通を調べたところ、マイコンのピン番号と変換アダプタのDIP配列のピン番号(=基板両端のシルク印刷)とが一致しました。
つまり、この変換アダプタに関しては、マイコンを取り付けたアダプタ全体が「44ピンのDIP形状のマイコン」の感覚で配線できることになります。

次に、今回のマイコンの各ピンの機能名を、ZCPU1およびZCPU3で使っている40ピンのマイコンZ8F6421PM020SGとを比較してみました。
結果は
完全に上位互換(*1)でした。
もう少し詳しく説明すると、40ピンは信号名が完全に一致し、残りの4ピンは
PD2
PC7/T2OUT
VDD
VSS
が割り当てられれていました。
この4ピンが増えているためピン番号が途中からずれて、ピン番号の互換性はありませんでした。

前回、両者は同じシリーズのマイコンであると説明しましたが、マニュアルも同じ「Z8 Encore! XP F64xx Series Product Specification(PS0199)」です。
同じマニュアルを見るのですから、当然、内蔵レジスタのアドレス、機能も一緒です。

以上を考えると、今回使用するマイコンZ8F6421VN020SGは、ZCPU3シリーズの配線図の通り(ただし、ピン番号ではなく)ピンの機能名を見て配線すれば、普通にZCPU3として動作すると考えられます。

ということで、配線してみました。

図 ZCPU3のボードからマイコンを取り外し、裏側からZ8F6421VN020SGを配線

この改造ボードにパソコンを接続して、ROM書込ソフトを走らせると「Connected to Z8F6421VN020SG」と表示されました。
無事、Z8F6421VN020SGと繋がったようです。

図 ROM書込ソフトを起動

この後、ZCPU3のファームウェアを書き込んで(*3)、マイクロBASICを動作させてみました。
~(チルダ)キーを押して、BASICプログラム(list_su5.txt)を読み込んだ後、RUN(#=1000)で素数を計算させています。(*2)

図 マイクロBASICで素数を計算

もうちょっと、話のネタとなるトラブルを期待(?)していたのですが、あっさり動作してしまいました。
パッケージの外観、ピン数が違うだけで、中身は同じ機能のマイコンなので、動いても仕方無いですよね。f(^_^;

次回は、ちょっと混乱気味なZCPU1、ZCPU3シリーズの体系を整理します。
--------------------
(*1)40ピンのマイコンZ8F6421PM020SGは、44ピンのマイコンZ8F6421VN020SGのピン数を40ピンに制限したサブセットと考えるのが正解かも知れません。
(*2)~(チルダ)キーによるセーブ、ロードはZTERM!独自の機能です。
(*3)ファームウェアの書込手順は「マイコンボード自作編」の「第3回 ファームウェアの書込、マイクロBASICの実行」を参照ください。
ただし、次の点に注意願います。
・ZCPU3シリーズ用のファームウェアをアセンブル、ROM書込してください。
・ZCPU3シリーズにはSW1、SW3が無いので、その部分の説明は無視してください。

第4回 代替マイコン第二弾「Z8F6421VN020SG」の検証(2)、まとめ(2023/07/17掲載,2023/09/03最終変更) ※タイトルを変更(2023/08/27)
前回は、ZCPU3シリーズのマイコンボードからマイコンを外し、ボードの裏側からZ8F6421VN020SGを配線して、正常に動作することを確認しました。
これと同じ回路で、新規にボードを製作してみましたが、特に問題なく動作しました。

図 新規に製作したZCPU3
Aマイコンボード(Z8F6421VN020SGを使用)

回路図は次の通りです。
U1以外はZCPU3回路図と同一です。

図 ZCPU3
A回路図(USB-シリアル変換モジュール部分を除く)

この回路図で、U1は44ピンPLCC形状のZ8F6421VN020SGです。(*1)
U1がZ8F6421PM020SGの回路図と区別するため、ZCPU3
A回路図と呼ぶことにします。

さて、以上で
Z8F6421PM020SGの代わりに、入手が容易な44ピンPLCC形状のマイコンZ8F6421VN020SGを使えば、今後も自作できることがわかりました。
これで、4回に渡った「続マイコンボード自作編」を終了いたします。
前半2回の試行錯誤にお付き合い下さった読者の皆様には、感謝申し上げます。

現時点でのZCPU1、ZCPU3シリーズ(自作ボードを含む)を一覧表に纏めましたので参考にしてください。

それからファームウェア(マイクロBSICを含む)は、オープンソース(MITライセンス)として公開しています。
MITライセンスというと堅苦しく聞こえますが、調べていただければわかる通り、縛りが緩くほぼ自由に使えるライセンスです。
気軽に使用、変更、公開、配布していただければと思います。(もちろん商用も可)
(マイコンにROM書込機能が内蔵されているため)ファームウェアは内蔵ROMに何も書き込まれていない
市販のマイコンに書き込むことが可能です。(*2)

今度は「機械語アプリケーション開発編」でお会いしましょう。
シリーズ名 製品名 回路図 マイコン ファームウェア PCとの接続 その他
ZCPU1シリーズ ZCPU1/K ZCPU1回路図 Z8F6421PM020SG
(40ピンDIP)
Micro BASIC
for ZCPU1
Dsub9ピン
(RS-232C)
PCなしでも動作可能
ZCPU/KW
ZCPU/KE 液晶表示器、4キースイッチ、EEPROMはオプション、SW1とSW3は68Ωで短絡
(自作ボード) 「マイコンボード自作編」回路図 Mini USB
またはMicro USB
「マイコンボード自作編」を参照
ZCPU3シリーズ 製品なし
(自作ボード)
ZCPU3回路図 Z8F6421PM020SG
(40ピンDIP)
Micro BASIC
for ZCPU3
Mini USB
またはMicro USB
「続マイコンボード自作編 第3回~第4回」を参照
(ファームウェアの書込手順は「マイコンボード自作編」を参照)
ZCPU3A回路図 Z8F6421VN020SG
(44ピンPLCC)
表ZCPU1、ZCPU3シリーズ一覧表(2023年8月時点)

--------------------
(*1)マイコンZ8F6421VN020SGを真上から刻印が正しく読める向きで見たとき、上段の中央のピンから反時計周りに1ピン~6ピン、7ピン~17ピン、18ピン~28ピン、29ピン~39ピン、40ピン~44ピンとなります。
(前回の「PLCC-DIP変換アダププタ」写真をご覧ください)
今回製作で使用した「PLCC-DIP変換アダププタ」は、マイコンのピン番号と変換アダプタの44ピンDIP配列のピン番号が一致していましたので、44ピンのDIP形状のマイコントみなして配線ができました。
しかし、これ以外の変換基板、アダプタなどでは一致しているとは限りませんので必ず確認してください。
(*2)マイコンボード自作編、続マイコンボード自作編は、内蔵ROMに何も書き込まれていない市販のマイコンを使って製作しています。

第5回 代替USB-シリアル変換モジュール「LC231X」の検証(1)(2023/08/20掲載,2023/08/27最終変更) ※タイトルを変更(2023/08/27)
さて、第4回で代替マイコンも決まり一件落着のはずだったのですが、ここで新たな問題が発覚しました。
実は「マイコンボード自作編」やZCPU3シリーズの回路で使っていたFTDI社のUSB-シリアル変換モジュール
UMFT230XA-02が生産中止になっていました。
USB-シリアル変換モジュールは他にも色々製品があるので、そんなに困ることではないのですが、価格、使い勝手を考えて推奨の代替品をFTDI社の
LC231Xとしました。
あくまでも「推奨」です。
LC231X以外でも全く問題ありません。(*1)


図 UMFT230XA-02とLC231X

さて、このLC231Xのピン機能ですが、ほぼUMFT230XA-02と同じ機能のピンがあります。
UMFT230XA-02と同じく3.3Vの電源出力ピンがあるため、これをマイコンボード全体の電源に使うことにします。
パソコンとの接続コネクタは、UMFT230XA-02がミニUSBだったのですが、LC231Xの方はマイクロUSBになってました。

それから、UMFT230XA-02とデバイスドライバが違うかも知れないかも?と気になっていたのですが、何もしなくて動作しました。
UMFT230XA-02との接続実績のあるPCなので、既に導入済みのデバイスドライバが動作したのだと思われます。(←あくまでも推測です!)

実際の配線は、写真の通りです。

図 ZCPU3A回路ボードの裏面にLC231Xを配線


図 ZCPU3A回路ボードのUMFT230XA-02を外して、代わりに裏面のLC231Xを配線

途中は省略しますが、普通にマイクロBASICが動作しました。
LC231Xは、問題なく使用できるようです。

今回はここまで。
次回は、ピン配置、デバイスドライバの導入などを解説する予定です。
--------------------
(*1)USB-シリアル変換モジュールに要求される仕様は
・Windowから見て仮想COMポートに見えること
・TXD、RXD信号線は3.3Vレベルであること(5VはNG)
・(必須ではないけれど)モジュール自身に3.3V電源出力があること
です。
第6回 代替USB-シリアル変換モジュール「LC231X」の検証(2)(2023/08/27掲載,2023/08/29最終変更)
前回は、USB-シリアル変換モジュールUMFT230XA-02をLC231Xに置き換えてZCPU3A回路を動作させてみました。
あっさり、マイクロBASIC動作したのですが、今回はもう少し詳しく見てゆきます。

まずLC231Xのコネクタとピン番号ですが、写真の通りです。(*1)
今回は、基板両側のコネクタCN12とCN13を使います。

図 LC231Xのコネクタ、ピン番号

配線図は次の通りです。

図 LC231Xの配線(UMFT230XA-02の代替)

配線を簡単に説明すると、次の通りです。
(1)PCのUSBコネクタからマイクロUSBケーブルを介してLC231Xに+5Vを供給し、これをLC231X内部で+3.3Vに変換して、+3V3(CN13-7)からZCPU3A回路に供給
(2)シリアルの送受信のため、LC231XのTXD(CN12-2)はZCPU3A回路のRXDに接続、LC231XのRXD(CN12-3)はZCPU3A回路のTXDに接続
(3)LC231XのRTS(CN13-1)とCTS(CN13-2)とを接続
(4)LC231XのGND(CN12-1)はZCPU3A回路のGNDに接続

配線後、回路図の+3V3(CN13-7)の出力電流を測定したところ、通常時で約9mA、ROM書込時で約5mAでした。
LC231Xの3.3V電源は30mA出力できるので、十分余裕があることがわかりました。(*2)

次にデバイスドライバです。
前回は、PCに新規にドライバを導入しなくてもLC231Xを認識して、仮想COMポート(VCP)として動作しました。
その時は、UMFT230XA-02との接続実績のあるPCなので、既に導入済みのドライバが動作したのだと思っていました。
今回は確認のため、今動いているドライバをPCから削除(アンインストール)してみたところ、それでもLC231Xを接続すると、認識してドライバがインストールされています。
Windowsのここらへんの仕組みの知識が全く無いので説明できないのですが、結論としては何もしなくてもWindowsが何とかしてくれるみたいです。f(^_^;
もし、ダメだったときのみFTDI社のHP(https://ftdichip.com/)からデバイスドライバをダウンロードしてみてください。
--------------------
(*1)LC231Xの詳細情報は、FTDIのホームページからダウンロードしてください。
ダウンロード方法は次の通りです。
【手順1】FTDIサイトのトップページ(https://ftdichip.com/)へ行きます。
【手順2】画面上部にあるメニューからPRODUCTSのModulesを選択し、Modulesページへ移動します。
【手順3】画面右にある検索(Serch)ボックスにLC231Xを入力します。

【手順4】現在表示しているリストがLC231Xに関する技術情報となります。Datasheet欄のDatasheetをクリックします。
(*2)ここではZCPU3
A回路図で説明していますが、ZCPU3回路もマイコンが違うだけなので電源の容量は問題無いと思います。
ただ「マイコンボード自作編」回路でLC231Xを使用する場合は、部品点数が多いので念のため電流測定して30mA以内かを確認してください。


------------------------------------------------------------
機械語アプリケーション開発編
------------------------------------------------------------

第1回 ROMディレクトリ機能(1)(2023/05/28掲載,2023/07/01最終変更)
ここでは,ZCPU1シリーズ、ZCPU3シリーズとその互換ボード上で走る「機械語アプリケーション」の開発をおこなってゆきます。
機械語と言っても、開発にはアセンブラを使います。
最初の開発は、今一番欲しい「ROMディレクトリ機能」です。

???

と、急に言われても、説明不足で何のことか判らないかと思いますので、順を追って説明したいと思います。

まず、やりたいことを説明します。
今後、機械語で書かれたアプリケーションプログラムを作成してROMに書き込んだ場合、そのプログラムを実行するには、マイクロBASICから
>=機械語アドレス
を実行します。
例えば、ROMに10進数で12345番地から実行開始するプログラムABCDEが書いてある場合、マイクロBASICから
>=12345
を実行することで、プログラムABCDEが起動します。

しかし、この方法はプログラムの数が多くなった場合、いちいち実行開始アドレスとプログラム名の対応を覚えておくかメモっておく必要があり、面倒です。
そこで、ROMの内容をスキャンして、ROM内に書き込まれているすべてのプログラムの「実行開始アドレスとプログラム名の対応」を表示するのが、今回開発するROMディレクトリ機能です。
具体的には次のような操作を考えています。

「ROMディレクトリ機能」も機械語で書かれたプログラムの1つで、あらかじめROM書込ソフトで5120番地に書き込んであるとします。
この状態で、マイクロBASICから
>=5120
を実行すると、5120番地に書いてある「ROMディレクトリ機能」のプログラムが起動して、ROMエリア全域(ファームウェアエリアなど一部は除外)を1ページずつプログラムの先頭かどうかを調べて、例えば次のように表示した後、マイクロBASICに戻ります。(*1)
5120:ROMDIR 1.0
8192:BRAINFK 1.1
9216:VTS 1.0
この例では、ROM内に3つのプログラムが見つかりました。
ここで、各行の先頭の数字はプログラムの先頭番地(10進数)を表し、コロン(:)の後に、プログラム名が続きます。
この時点で「VTS 1.0」とういうプログラムが9216番地にあることが判ったので
>=9216
とすると「VTS 1.0」というプログラムが実行されます。

さきほど「1ページずつプログラムの先頭かどうかを調べて…」と書きましたが、1ページ=512番地(200H番地)です。
ページとROMアドレスとの対応は表をご覧ください。(赤枠部はファームウェアエリア)

表 ページとROMアドレスの対応(16進数)

さて、ここで疑問があります。
プログラムの名称と、その先頭アドレスの情報がどこかに無ければROMディレクトリを表示できませんが、いったいどこにあるのでしょうか?
どこにあるかというと、ROMの各ページの先頭の16バイトです。
ROMディレクトリ機能は、ROMの各ページの先頭から4バイトを調べて、特定のビットパターン「
8B0E3FD9H」の場合に限り、このページをプログラムの先頭とみなします。
そして、これに続く残り12バイト(12文字)がそのプログラム名称となります。(*2)

図 ROMアドレスとROM内容

では、次の疑問、9216番地以降のビットパターンが「8B0E3FD9H」だったとして
>=9216
を実行したら、機械語プログラムではなくビットパターン8B、0E、…を実行してしまうのではないでしょうか?
でも、安心してください。
ビットパターン8B0EHは、eZ8CPUでは14バイト先への無条件相対ジャンプ命令(JR)に相当します。
ビットパターンの後半2バイトとプログラム名の12文字データを飛び越えた直後の9232番地の機械語プログラムを実行します。

何となく、実現できそうな気がしてきました。
残る課題は、ROMの内容をデータとしてリードする命令がeZ8CPUの命令セットにあるかどうかです。(命令LDC/LDCIらしのですが、1回も使ったことがありません)
多少、不安を残しつつ、次回に続きます。
--------------------
(*1)BRAINFK、VTSは架空のプログラム名です。少なくとも現時点では… f(^_^;
(*2)ビットパタ-ンの後半2バイト(3FD9H)はeZ8機械語の未定義命令のため、プログラムの途中にこの特定のビットパターン(8B0E3FD9H)が現れることはほぼありません。

第2回 ROMディレクトリ機能(2)(2023/06/18掲載,2023/07/01最終変更)
今回は、ROMディレクトリ機能の続きです。
詳細設計から始めて、実際に動作させるところまで一気に説明します。

まず、このプログラム名称は「ROMDIR 1.0」とし、ROMの1400H(5120)番地に配置することにします。
ちなみに、ROMの0AH(10)ページに相当します。

アルゴリズムは、次のステップ1~ステップ8の通りです。
コーディングしなければならないので機械的に書いてありますが、一言いうと「ROM内容を512番地おきにスキャンして、8B0E3FD9Hだったら、その番地とその後に続く12文字を表示」しています。

ステップ1 プログラム先頭の1400H番地から1410H番地へジャンプ(ステップ2へ)
ステップ2検索用のROMアドレス変数(検索アドレス)の初期値を1200H番地にして、改行を出力
ステップ3 検索アドレスを+200H加算
ステップ4 検索アドレスがROMの検索領域を超えたらプログラムを終了し、マイクロBASICに戻る
ステップ5 検索アドレスのROM内容の先頭が「プログラム先頭パターン」(8B0E3FD9H)でなければ、ステップ3へ
ステップ6(この時点でプログラムが見つかったので)検索アドレスを出力
ステップ7 ":"を出力
ステップ8 検索アドレスのROM内容の「プログラム名称」を出力、ステップ3へ

このアルゴリズムをコーディングする段階で問題点が発生したので、これを説明します。

【問題点1】アセンブラASMB!は文字を直接扱えないため、プログラム中で文字を出力するときASCIIコードで記述することになりますが、これだと何の文字のコードなのかわかりにくため、次のようにASCIIコードをEQU疑似命令でラベル定義しました。
CH_A EQU %41
CH_B EQU %42
...
でも、この方法だとプログラムを開発する度に毎回同じ定義する必要があり、スマートなやり方とはいえません。
そこで今後のことも考えて、ASCIIコードのラベル定義を別ファイル(ASCII.LIB)にまとめ、アセンブル時に本体のプログラム(ROMDIR.ASM)と結合することにしました。
アセンブラASMB!でのソースの結合方法は、少し変わっています。
まず、
結合するソース名を列挙したテキストフィル(xxx.INC)を作っておきます。
ソース名を列挙したテキストフィルを仮に「ROMDIR.INC」とすると、その中身は次の2行です。
ASCII.LIB
ROMDIR.ASM

アセンブラASMB!を起動すると、ソースファイル名を聞いてきますが、ここでROMDIR.
ASMではなく、ROMDIR.INCを入力します。
ASMB!は、ROMDIR.INC内に列挙してあるファイル名のソースを結合して、それをアセンブルします。(これで解決!)

では、次に行きます。

【問題点2】ROM内で見つけたプログラムのアドレスを表示するために「16ビットデータの10進数出力」機能が必要です。
この機能はファームウェアにサブルーチンとして存在しているので、このソースを流用すればよいのですが、単なるソースのコピペではプログラムが肥大化してしまいます。
かといって、ファームウェア内のサブルーチン(機械語)を絶対番地で直接コールすると、プログラムは肥大化しませんが、今後ファームウェアがバージョンアップする度にサブルーチンのアドレスが移動し、これに合わせてアプリケーションのソフトをも変更しなければなりません。
となれば、ここは
ファームウェア内のサブルーチンをシステムコール化(呼び出しアドレスの固定化)一択かと思います。
既存のファームウェアにも、1文字出力(OUT1C)、1文字入力(INP1C)などのシステムコールはあるのですが、今回ファームウェアをバージョンアップ(*1)して、システムコールを増やし、その中に「16ビットデータの10進数出力」機能も含めることにしました。
下のリストはZCPU3のファームウェアのシステムコール部分で「16ビットデータの10進数出力」機能はシステムコール6BH(OUTNN)です。

図 ZCPU3のファームウェアVer1.01のシステムコール

あとは特に問題ないと思います。
今回のソースプログラムは、ここからダウンロードしてください。(ROMDIR1_0.zip)
コーディング上の注意事項はソース内に記載してあります。(ソース内ではプログラムをアプリと呼んでいますが気にしないでください)

また、アセンブル、ROM書込の手順は「マイコンボード自作編」の「
第3回 ファームウェアの書込、マイクロBASICの実行」を参考にしてください。(*2)

では、最後に実行結果です。

図 実行結果

マイクロBASIC起動後(*3)
>=5120
で、今回開発したROMDIRプログラムを実行し、ROMの中にある2つのプログラム(ROMDIR 1.0とHELLO)を表示しました。
「HELLO」プログラムの先頭アドレスが32768番地であることがわかったので
>=32768
を実行したところ、HELLOプログラムが"HELLO!"と表示した後、制御がマイクロBASICに戻りました。
この「HELLO」プログラムは、ROMディレクトリ表示が1行だけだと寂しいので、適当に作ってROMに書き込んだプログラムです。f(^_^;
;--------------------
(*1)ファームウェアの次のバージョン以上でシステムコール68h~95hをサポートしています。
Micro BASIC for ZCPU1 Version1.03
Micro BASIC for ZCPU3 Version1.01
(*2)今回のプログラムはファームウェアエリア(0000H~0FFFH)以外のエリアに書き込むので、ROM書込ソフトで"SEIGENKAIJO"の入力は不要です。
(*3)マイクロBASIC の起動画面で「mBASIC 1.01 /4」と表示していますが、末尾の「/4」は、ROMに書き込まれたファームウェアの識別のために設けたNo.(ROMパターンNo.)です。


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

[トップページに戻る]

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