EMUZ80をうごかしてみる(BASICとUniversal Monitor)

EMUZ80

電脳伝説さんの新作、EMUZ80基板を動かしてみました。詳細な技術資料があるので、誰でも(?)Z80マイコンを動かすことができます。私はいつものとおり、よく解説を読まずにハマったので、そのあたりの解説と…標準で起動するBASICをUniversal Monitorへ変更してみたので、その手順をまとめてみます。

EMUZ80を動かす

EMUZ80基板ですが、Z80にPICを1つくっつけただけでシングルマイコンボードとして動くという、たいへん野心的な基板であります。標準でZ80のBASICが稼働しますので、どんなブログラムも自由自在に動かすことができます。

EMUZ80が完成
Z80とPIC18F47Q43で動く挑戦的なコンピュータEMUZ80が完成した。設計の目標は、できるだけ少数の…

まずは、EMUZ80に部品を組み付けて動かしてみます。
EMUZ80基板は、オレンジピコさんとこで頒布してますので、そちらでゲットがオススメです。

EMUZ80専用プリント基板 :PICO-A-051:オレンジピコショップ - 通販 - Yahoo!ショッピング
EMUZ80はZ80とPIC18F47Q43で動く2チップ構成のコンピュータです。最少の安価な部品で完成し、BASIC が動きます。本商品はEMUZ80のプリント基板のみとなります。技術資料とソフトウェアの提供元は下のブログでご案内しています。電脳伝説のブログ-EMUZ80が完成☆部品セットは次のURLからご購入できま...

部品セットも売ってたりします。

EMUZ80部品セット :PICO-A-052:オレンジピコショップ - 通販 - Yahoo!ショッピング
オレンジピコショップのEMUZ80部品セット:PICO-A-052な&#12425...

回路図とか、部品組みつけに関する注意とかもろもろは詳細な技術資料がPDFで公開されています。ちゃんと隅から隅まで読みましょう。わたしは斜め読みしてハマりました。

http://www.amy.hi-ho.ne.jp/officetetsu/storage/emuz80_techdata.pdf

部品を一通りはんだ付けした状態がこんな感じです。

EMUZ80でBASICを動かしてみよう

PICのBASICつきファームウェアがgithubで公開されています。Hex形式のファイルをマイクロチップ社のPIC プログラマ SNAPで書き込みするとBASICが動きます。

GitHub - vintagechips/emuz80: The computer with only Z80 and PIC18F47Q43
The computer with only Z80 and PIC18F47Q43. Contribute to vintagechips/emuz80 development by creating an account on GitHub.

ちなみにSNAPはPickit4の廉価版のPICプログラマーです。ちょっと前まで2千円を切っていたと思うんですけど気がついたら秋月電子通販で3,700円ぐらいになってました。とほほ。円安のせい?

マイクロチップ MPLAB SNAP: 開発ツール・ボード 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作マイクロチップ MPLAB SNAP秋月電子通商 電子部品通信販売

PICヘ書き込むためにはパソコンへMPLAB X IDEを入れる

EMUZ80の技術資料にも書いてますが、書き込みのためには Microchip社のMPLAB X IPEというプログラムが必要で、MPLAB X IDEをインストールするとおまけで入ります。

MPLAB® X IDE | Microchip Technology
MPLAB X IDE is an expandable, highly configurable software program that offers tools to help you program our microcontrollers and digital signal controllers.

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を動かしてみます。たいへん移植性に優れた機械語モニターで、いろんなマイコンボードでお世話になっております。ターゲットボード用のビルド方法も詳細に出てますので、安心です。

Universal Monitor | Electrelic
Universal Monitor はさまざまなプロセッサで同一操作のモニタを使いたいということから生まれました。 元になっているのは以前 Z80 用に書いたモニタで、次々に移植して現在のところ MC6800, MC6809, 8080, Z8, Z80, 6502, SC/MP, TLCS-90, MN1610, T...

今回はターゲットマシンが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

コメント