電脳伝説さんの新作、EMUZ80基板を動かしてみました。詳細な技術資料があるので、誰でも(?)Z80マイコンを動かすことができます。私はいつものとおり、よく解説を読まずにハマったので、そのあたりの解説と…標準で起動するBASICをUniversal Monitorへ変更してみたので、その手順をまとめてみます。
EMUZ80を動かす
EMUZ80基板ですが、Z80にPICを1つくっつけただけでシングルマイコンボードとして動くという、たいへん野心的な基板であります。標準でZ80のBASICが稼働しますので、どんなブログラムも自由自在に動かすことができます。
まずは、EMUZ80に部品を組み付けて動かしてみます。
EMUZ80基板は、オレンジピコさんとこで頒布してますので、そちらでゲットがオススメです。
部品セットも売ってたりします。
回路図とか、部品組みつけに関する注意とかもろもろは詳細な技術資料がPDFで公開されています。ちゃんと隅から隅まで読みましょう。わたしは斜め読みしてハマりました。
http://www.amy.hi-ho.ne.jp/officetetsu/storage/emuz80_techdata.pdf
部品を一通りはんだ付けした状態がこんな感じです。
EMUZ80でBASICを動かしてみよう
PICのBASICつきファームウェアがgithubで公開されています。Hex形式のファイルをマイクロチップ社のPIC プログラマ SNAPで書き込みするとBASICが動きます。
ちなみにSNAPはPickit4の廉価版のPICプログラマーです。ちょっと前まで2千円を切っていたと思うんですけど気がついたら秋月電子通販で3,700円ぐらいになってました。とほほ。円安のせい?
PICヘ書き込むためにはパソコンへMPLAB X IDEを入れる
EMUZ80の技術資料にも書いてますが、書き込みのためには Microchip社のMPLAB X IPEというプログラムが必要で、MPLAB X IDEをインストールするとおまけで入ります。
PICへ書き込むときの注意
技術資料をちゃんと読んでいればハマりどころはあまりないのですが、わたしはMPLAB X IPEでHex形式ファイルを読み込んで PIC ICへ書き込みする際に、PICプログラマ SNAPがCONNECT時にエラーを吐いて困りました。電圧が足りない?などのエラーを吐くのでした….いろいろとMPLAB X IPEの設定じゃろか?PIC ICの問題じゃろか?と思っていたのですが、技術資料に出ている手順を1つ飛ばしていたのが原因でした…orz
EMUZ80 技術資料より
EMUZ80の技術資料に、PICへ書き込むときの手順が画像入りで詳細に出ているわけですが、私は(1)の「Setting→RElease from Resetを選択」を、まんまと見逃してうんうん言っていたのでした。
みなさん注意です。(きっと私だけですね…)
シリアル経由でBASICを起動!
SBC8080やKZ80-CPUBといっしょで、FTDI型のTTLレベルシリアルコンバータをつないだPCで9600bpsにあわせたTeraTERMなんかで接続すると、BASICの起動メッセージを見ることができます。
昔懐かしいBASICですので、行番号とともにプログラムを入力してみましょう、1から100まで足すとかお茶の子さいさいです。
またTeraTERMがかつてのシリアル経由接続テレタイプライタと同等ですので、入力したプログラムはLISTコマンドで画面表示する際に、TeraTERMのログ機能でファイルへ残しておくことで次回 ロードしなおすことができます。入力したプログラムを紙テープへパンチしておいて、次回ロードするのと一緒ですね。(という例えのほうが分かりづらい…)
Universal Monitorを動かしてみる
技術資料にも書いてますが、ファームウェアにはROMにあたるデータもmain.cのお腹の中にもってまして、そこを差し替えるとマイコン起動時に別のプログラムを動かすことができます。やはりBASICのつぎはマシン語ですのでモニタープログラムを動かしてみたい。
で、いつもお世話になっているElectrelicさんのUniversal Monitorを動かしてみます。たいへん移植性に優れた機械語モニターで、いろんなマイコンボードでお世話になっております。ターゲットボード用のビルド方法も詳細に出てますので、安心です。
今回はターゲットマシンがZ80 CPUですので、”z80″フォルダのファイルを使います。
移植-1 : config.incに定義追加・変更
メモリー配置の変更
まずはconfig.incにメモリー配置が記述されていますのでEMUZ80の技術資料のメモリーマップを参照しながら適当に設定します。
RAM_B: EQU 8000H
WORK_B: equ 8F00H
STACK: equ 8FFFH
EMUZ80のシリアル入出力用アドレスの定義
EMUZ80のシリアル入出力はメモリーマップドI/Oですので、そのアドレスに名前をつけておきます。また併せてUSE_DEV_EMUZ80というフラグを定義して “1”を立てておきます。ほかのUSE_DEV_xxxに”1″がある部分は”0″にして使わないように変更します。
;;;
;;; EMUZ80
;;;
USE_DEV_EMUZ80 = 1
IF USE_DEV_EMUZ80
USARTD: equ 0E000H ; Data Register
USARTC: equ 0E001H ; Control / Status Register
ENDIF
移植-2 : unimon_z80.asmに追加
続いてUniversal Monitor本体ソースにEMUZ80のドライバーを読み込む部分を付け加えておきます。
;;;
;;; Console drivers
;;;
IF USE_DEV_EMUZ80
INCLUDE "dev/dev_EMUZ80.asm"
ENDIF
移植-3 : EMUZ80シリアルドライバーを作る
devディレクトリに各種のシリアルチップに対応したドライバーソースがありまして、そこの適当な奴を真似して”dev_EMUZ80.asm”を作ります。
今回も電脳伝説さんの提供してくださっているBASICのソースからシリアル部分をいただいてきました。いつもありがとうございます。
INIT:
;; Reset USART
RET
CONIN:
RXA: LD A,(USARTC)
BIT 0,A
JR Z,RXA
LD A,(USARTD)
CP 'a'
RET C
CP 'z'+1
RET NC
AND 0DFH
RET
CONST:
IN A,(USARTC)
AND 01H
RET
CONOUT:
TXA: PUSH AF
TXAST1: LD A,(USARTC)
BIT 1,A
JR Z,TXAST1
POP AF
LD (USARTD),A
RET
イニシャライズルーチン”INIT”は特になにもすることがないのでRETでリターンします。CONIN、CONOUTルーチンはBASICからいただいたソースのままです。CONSTルーチンはなんとなくBASICソースの一部を真似してみました。(間違ってるかも)
移植-4 : ビルドのためのMakefileの変更、ビルド
Makefileがついてますので、The Macroassembler ASが導入されたUNIX環境でしたらそのままmakeコマンドを実行するとIntel Hex形式のオブジェクトデータが生成されます。今回はIntel HexではなくてPICのソースに仕込むC言語ヘッダ形式を作りたいので、makeではバイナリファイル”bin”形式のデータをつくりたいと思います。以下のようにMakefileをいじりました。
#
# Makefile
# Universal Monitor for Z80
#
.SUFFIXES: .asm .p .hex .sr .bin
devs := dev/dev_8251.asm dev/dev_z80sio.asm dev/dev_z280.asm \
dev/dev_64180.asm dev/dev_emily.asm dev/dev_EMUZ80.asm
all: unimon_z80.bin
.p.hex:
p2hex -F Intel $*.p $*.hex
.p.bin:
p2bin $*.p $*.bin
.p.sr:
p2hex -F Moto $*.p $*.sr
.asm.p: config.inc $(devs)
asl -L $*.asm
config.inc:
[ -e config.inc ] || ln -s config/config.inc config.inc
clean:
rm -f *.p *.hex *.sr *.lst *.bin
all: のところに ”unimon_z80.bin”、devs :=のところに”dev/dev_EMUZ80.asm”を追加。.p.bin:のところに、”p2bin $.p $.bin” というかたちでアセンブリした結果のpファイルからバイナリ形式ファイル binを生成する部分を書いておきました。
あとはmakeするだけで unimon_z80.binが生成されます。Z80のメモリーイメージがバイナリで入っているファイルです。
出来上がったバイナリファイルをC言語ヘッダ形式へ変換(xxdコマンド)
バイナリファイルをC言語ヘッダ形式(xxh,xxh,という配列形式)に変換するのに、Linuxなどに標準でついてるxxdコマンドを使いました。最初は自分でプログラムを書こうかと思いましたが、実績のあるコマンドのほうが安心です。以下のコマンドでunimon_z80.binからC言語インクルード形式へ変換した文字列が生成できます。
$ xxd -i unimon_z80.bin > unimon_z80.txt
上記コマンドで生成される unimon_z80.txtの中身は以下のようなC言語配列形式っぽいやつとなります。いい感じでEMUZ80のソースのROM部分と入れ替えできそうです。
unsigned char unimon_z80_bin[] = {
0xf3, 0xc3, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc3, 0xce, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc3, 0xe4, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc3, 0x02, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x2d, 0x09, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x00, 0x01, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc3, 0x23, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff,
:
:
MPLAB X IDEでmain.cのROMデータ差し替え & ビルド
ここからはEMUZ80の技術資料「標準プログラムの改編」の項に出ている手順に従ってMPLAB X IDEを使ってPICのプログラム main.cのROMデータ部分をUniversal Monitorのものに差し替えてコンパイルすると新しいPIC用ファームのIntelHexファイルを作ることができます。そのままPICへSNAPで書き込みしてもOKです。
MPLAB X IPEでPICへ書き込み
わたしはMPLAB XIDEを初回起動したときに、SNAPをつながず起動してしまったせいかダミーのライターがデフォルトになってしまったので、ひとまずコンパイルだけMPLAB X IDEで実施して、”emuz80\emuz80.X\dist\default\production”に出来上がった”emuz80.X.production.hex”ファイルをMPLAB X IPEで書き込むという遠回りな方法でEMUZ80のPICヘ書き込みしました。
動いた!
いろいろとありましたが、無事EMUZ80でUniversal Monitorを起動することができました。これで、パソコンのクロスアセンブラで作ったマシン語プログラムをEMUZ80のセカイに自在にロードできる環境ができました。みなさんも是非!!
本来であれば、PICのファームをカスタマイズして高機能化!とかの方向なのだと思いますが、わたしにはそんなスキルはないので、EMUZ80基板のZ80 CPUのサイドに配置したピンソケットから信号を延長して、何か別の基板でLEDチカチカとかやってみたいと画策していますw
コメント