HD68P05V07でHELLO,WORLD

このブログを始める時点でもう所有していた、いわば創業メンバーのHD68P05V07。いままで話題にしなかった第1の理由はプログラミングモデルがシンプルすぎてまともな仕事をやらせる自信がなかったから。実質2本の8ビットレジスタだけで動かさなければならない上にPUSH/POP命令がなくて使い回しが難しい。あかん、と思っていたらcafe2.54さんがブログに<HD68P05V07で工作>を投稿してくれたんで、じゃあボクもやってみる。

HD68P05V07

いままで手を付けなかった第2の理由は、やろうと思えばいつでもできそうだったから。ピギーバックって電源だけつなげばすぐ動くイメージだよね。実際はクロックジェネレータの外付け部品とかリセット回路とかが必要だし、電源まわりに電源スイッチとパイロットランプを付けようとすればなおのこと面倒になる。ざっと揃えてみた部品が下のとおり。あらら、抵抗2本とICソケットとピンソケットとユニバーサル基板を忘れてる。

HD68P05V07_craft1

実体配線図と回路図を下に示す。実体配線図は秋月電子通商の片面ガラスCタイプのユニバーサル基板に組み立てる想定で描いてあり、配線しやすいよう底面図とした。部品の定数は回路図に書き込んである。抵抗R2は欠番。リセットスイッチと直列に入れてあったのだが大した働きをしていないから省略した。その点と一部の抵抗の定数はこのあと示す製作例の写真と一致していない。雑な設計で作り始めてからいろいろ見直す性分。

HD68P05V07_craft2
別窓でPDFの回路図を開く
別窓でPDFのHD68P05V07日本語データシートを開く

HD68P05V07の両側には必要に応じて回路を追加できるようにピンソケットを立てておいた。このピンソケットは普通に取り付けたらHD68P05V07が押し広げる格好になってしまったので、これから作る人はユニバーサル基板の穴の径が許す限り広げて取り付けるほうがいい。そのほかDCジャックやタクトスイッチの脚がユニバーサル基板にはまらないなどいろいろな問題に直面するだろうが、そこは各自の工夫でうまいこと解決してほしい。

HD68P05V07_craft7

これで何をやるか、作ったあとで考えるのが趣味の電子工作。追加の製作なしにいける面白そうなことといったらHELLO, WOLDかな。ハードウェアはUSB-シリアル変換ケーブルを下のとおりつないでおしまい。あとはソフトウェアシリアルでやる。目標は、1文字出力を作って文字列を出力、ついでに1文字入力も作ってエコーバックを成功させる。製作の担当者としてはそこまでが業務範囲であとは知らんというのがこのブログの方針。

HD68P05V07_craft3

ソフトウェアシリアルは過去に何回か成功させていて複数の作り方を承知している。タイマ割り込みを使う方法が見た目かっこいいが速度が出ない。愚直に命令を並べ、実行クロック数を数えてタイミングをとることにした。この方法は、普通の人には簡単だが、そそっかしいやつはよく足し算を間違える。UV-EPROMを消しては書いているうちにEEPROMが使えるんじゃないかと思って試したらなんとW27C512まで大丈夫なことがわかった。

HD68P05V07_craft4

かくしてHD68P05V07のソフトウェアシリアルが完成、通信速度9600bps、通信形式8N1でHELLO, WORLDとエコーバックテストに成功。アセンブリ言語のソースHELLO05.asmをGistにあげておく。入出力に使うポートはどこにでも設定可能。これがソフトウェアシリアルの利点だよね。ただひとつ残念ながら文字列出力をサブルーチンの形にまとめられなかった。そこはプログラミングモデルがシンプルすぎるHD68P05V07の限界。

HD68P05V07_craft5

面白そうだから作ってみよう、なんていう人はいないと思うが、レポートの様式としていちおう再現性を担保しておく。HD68P05V07は若松通商に在庫がある。ROMは本来2732を使うのだが前述のとおりW27C512が使えて、そのほうが安いし便利。後半の$F000以降が有効で、それより前は無効。W27C512はオレンジピコショップで販売している。あとは現役の平凡な部品。秋月電子通商と千石電商の2件だけで間に合うはず。

HD68P05V07_craft6

このブログでは動作確認に成功したあと次のふたつをやることが恒例になっている。ひとつはプリント基板を頒布すること、なんだけど今回は手配線しても大した手間ではないからやめておく。もうひとつは得意満面で自慢すること。どや!!

広告
カテゴリー: 6805 | コメントをどうぞ

SBCZ80を再検討

SBCZ80は正常に動作していったん開発を終了したが、その後、DRAMの制御回路がまずいんじゃないかというご意見をいただいたので再検討した。まずご意見の趣旨を説明しておくと、下に示す部分で前のCASが終了しないうちに次のRASが始まるおそれがあること。現状、RASMUXCASを下げるのと同じ時間差で上げているが、上げるほうはいっせいに上げるべきだというわけ。

sbcz80_tchrl

ご意見をいただいた時点でDRAMの制御回路は下に示すとおり。RASからMUXまで46n秒、MUXからCASまで52n秒で合計98n秒。許される時間差は最大100n秒だから、どうにか間に合っているもののギリギリ。ちなみに、ご意見ではMREQからRASまでの時間を足してぜんぜん間に合っていないといっているが、RASが遅れた分は次のRASも遅れるわけだから考慮しなくていいと思う。

sbcz80_dram_old

この制御回路はコンデンサC5とC8を調整して最終的に時間差を合計60n秒まで縮めた。それで正常に動作し、オシロスコープで波形を観測してもまったく問題がない。設計の目標はDRAMが動くいちばんシンプルなロジックだったから、これをひとつの答えにしようと思う。ただし、RASMUXCASをいっせいに上げるべきだという意見は正論だし、万が一、できないからやらないんだと思われても困るので、下に示す回路を作った。

sbcz80_dram_new

試作機はもちろん正常に動作した。だって正論に近づく方向で作ったんだから。部品に変更がないためプリント基板はそっくり。抵抗とコンデンサの位置が微妙に違うのとリビジョン番号が03から04に上がっている。痛いな、これで15ドルだよ。

sbcz80_new

というわけで似たようなのふたつも作っちゃったな。まあいいやZ80が好きだから。もしかしたら正式リリースの段階で出版社がリビジョン04にしろっていうかもしれないし。

カテゴリー: Z80 | 2件のコメント

SBCZ8002_reference

ザイログのZ8002を採用したコンピュータSBCZ8002が完成し、プリント基板の頒布をピコショップ(新店舗)にお願いした。SBCZ8002は簡易モニタを備え、単体でメモリの読み書き、HEXファイルのロード、サブルーチンの呼び出しができる。一方、製作には28C16とPIC12F1822とGAL16V8の書き込みが必要で、ごめんね、誰にでも簡単とは言い難い。

SBCZ8002_top

●製作と運用に必要なファイル
部品表-sbcz8002_partslist.pdf
回路図-sbcz8002_sch.pdf
データパック-sbcz8002_datapack.zip

●SBCZ8002の製作

1.部品表にしたがって部品を揃える。

2.データパックのファームウェア等を書き込む。
IC1のGAL16V8にSBCZ8002.jedを書き込む
IC3の28C16にmonz8k_odd.binを書き込む
IC7の28C16にmonz8k_even.binを書き込む
IC10のPIC12F1822にz8002crgen.hexを書き込む
※TL866II Plusがすべてに対応しているという情報をいただきました。

3.部品番号で照合し、プリント基板の所定の位置に取り付ける。

●SBCZ8002の運用

1.部品表にしたがって運用に必要な製品を揃える。

2.セットアップする。
ピンヘッダにUSB-シリアル変換ケーブルを挿し、パソコンと接続
パソコンで端末ソフトを起動(9600bps、8ビット、1ストップビット、パリティなし)
DCジャックにACアダプタを接続
電源スイッチを入れる

3.簡易モニタで遊ぶ。
簡易モニタの使いかたはこちらの投稿を参照

●独自のアプリの開発
SBCZ8002のアプリおよび簡易モニタのアプリはgcc(2.9だけど)で開発できる。
開発環境を構築する方法はこちらの投稿を参照
開発の手順と実例はこちらの投稿を参照

SBCZ8002は世界でいちばん貧弱なZ8002マシンを目指しており、メモリが小さいし、インタフェースがさびしい。それでは満足できない人がいると思うから、Z8002の両側にピンソケットを立てておいた。さあ、ドータボードでも作って好きなように拡張しやがれ。

カテゴリー: Z8000 | コメントをどうぞ

SBCZ8002のアプリ開発手順

SBCZ8002のアプリはFedoraCore9とz8kgccのクロス開発環境で能率的に開発することができる。実際、簡易モニタmonz8kが比較的短時間で完成した。その開発工程が頭から消えてしまわないうちに、クロス開発環境の要点をまとめておこうと思う。

1.クロス開発環境の構築
Z8000のクロス開発環境にしたがいクロス開発環境を構築。

2.開発用のディレクトリを作り開発に必要なファイルを保存
データパックのsbcz8002.tar.gzをホームディレクトリに置く。
以降のコマンドを「端末」から入力。

tar zxvf sbcz8002.tar.gz

開発用のディレクトリへ入ってファイルを確認。

cd sbcz8002
ls

●標準アプリと簡易モニタ用アプリ
SBCZ8002のROMに書き込んで実行するアプリを標準アプリと呼ぶ。
簡易モニタでRAMにロードして実行するアプリを簡易モニタ用アプリと呼ぶ。

標準アプリに関係するファイルは次のとおり。
sbcz8002.x-標準アプリのROMイメージを作るリンカースクリプト
splitとsplit.c-ROMイメージを偶数/奇数に振り分けるプログラムとソース
monz8k.*-簡易モニタのソースと開発の過程で生成されたファイル
monz8k_even.binとmonz8k_odd.bin-偶数ROMと奇数ROMのイメージ

簡易モニタ用アプリに関係するファイルは次のとおり。
monapp.x-簡易モニタ用アプリのHEXファイルを作るリンカースクリプト
hello.*-簡易モニタ用アプリのサンプル

標準アプリと簡易モニタ用アプリは開発の手順が少し違う。まず標準アプリの開発手順を述べ、次に簡易モニタ用アプリの開発手順を述べる。

●標準アプリの開発手順
標準アプリはZ8002のリセットによって実行されるためスタートアップルーチン(リセットベクタとスタックポインタの設定)が必要。

3.C言語のソースを記述する
先頭にこんな感じでスタートアップルーチンを記述。

// Start up routine
__asm__ ("sect .text");
__asm__ ("wval 0");
__asm__ ("wval 16384");
__asm__ ("wval 6");
__asm__ ("ld r15,#0");
__asm__ ("jp _main");

ポートの入出力はこんな感じで記述。

// In value from port
unsigned char inb(unsigned int port){
	unsigned char value;

	__asm__ volatile (
	"inb %Q0,@%H1 \n\t"
	: "=r"((unsigned char)value)
	: "r"((unsigned int) port)
	);
	return value;
}

// Out value to port
void outb(unsigned int port, unsigned char value){

	__asm__ volatile (
	"outb @%H0,%Q1 \n\t"
	:
	: "r" ((unsigned int)port), "r"((unsigned char)value)
	);
}

一連の操作をできるだけ簡単に済ませるため、ソースはひとつのファイルにまとめ、標準ライブラリを使わず、参照はすべてこのファイルの中で解決する。

4.ROMイメージの生成
C言語のソースから偶数/奇数ROMのイメージを作る工程は次のとおり。ソースが正しく記述されていれば機械的な操作で済むが、実際は各段階でエラーが発生しがち。

z8k-coff-gcc -Os -nostartfiles -T sbcz8002.x -o monz8k.o monz8k.c
z8k-coff-objcopy -O binary monz8k.o monz8k.b
./split monz8k.b

●簡易モニタ用アプリの開発手順
簡易モニタ用アプリはスタートアップルーチンやポートの入出力などハードウェア寄りの処理がいらない。コードは%8000から配置され、実行開始アドレスも%8000となる。

3.C言語のソースを記述する
簡易モニタ用アプリは簡易モニタの内部関数を呼び出すことができる。内部関数のアドレスは次の操作で表示される。

z8k-coff-nm monz8k.o

内部関数putstrを呼び出してhello, worldを表示する記述例hello.cは次のとおり。

/*	hello world
	SBCZ8002 Rush Monitor application
	Most simple example
*/

// Set address into function pointer
void (*putstr)(unsigned char *) = (void *) 0x0202;

main(){
	// Call function with argument
	putstr("hello, world\15\12");
}

4.HEXファイルの生成
hello.cからhello.hexを作る操作は次のとおり。

z8k-coff-gcc -Os -nostartfiles -T monapp.x -o hello.o hello.c
z8k-coff-objcopy -O ihex hello.o hello.hex

率直なところ、以上の説明があらゆる場合に十分かどうかはわからないし、達人が見たらだっせーことやってるなと感じるかもしれない。だとしても、この手順で今のところ問題が生じていないのは事実。少なくとも簡易モニタを拡張して普通のモニタへ発展させることはできると思う。

カテゴリー: アプリケーション, コンパイラ, Z8000 | 1件のコメント

SBCZ8002の簡易モニタ

SBCZ8002の簡易モニタは単独でプログラムの入力、実行、メモリの表示ができて、必要ならクロス開発環境で作ったHEXファイルを読みこめる。それ自体が素晴らしいプログラムだとは言い難いが、いつか素晴らしいプログラムを作るための第一歩にはなると思う。

●共通事項
英字の入力は大文字でも小文字でもいい。
数値の入力は16進数、桁数が多すぎる場合は下位桁を採用。
プロンプトの数値はカレントアドレス。
度を越した操作ミス(引数が71字を超えるとか)はフォローしきれない。

●HELP
コマンドの概略を表示する。あまり親切ではないのでド忘れ思い出し用。monz8k_comhelp

●xxxx(16進数4桁以内)
カレントアドレスを変更。
monz8k_comxxxx

●SET
引数で指定した数値や文字をカレントアドレスから並べる。数値は1バイト単位。文字はシングルクォート(‘)で囲む。数値や文字はコンマ(,)で区切って入力制限(78字/行)まで羅列可能。シングルクォートそのものは27、コンマそのものは2Cで指定する。
monz8k_comset

●DUMP
引数で指定した範囲を含む前後のメモリ内容を表示する。引数は開始アドレスと終了アドレス。開始ア ドレスを省略するとカレントアドレスが使われる。終了アドレスを省略すると開始アドレス+16バイトが使われる。このコマンドを実行した直後、全部を省略する(改行のみ入力する)とカレントアドレスから16バイトを表示する。
monz8k_comdump

●CALL
引数で指定したアドレスのサブルーチンを呼び出す。
monz8k_comcall

●LOAD
HEXファイルを読み込んでRAMに並べる。以降、データパックに含まれるHEXファイルのサンプルhello.hexで操作例を示す。エディタはメモ帳、端末ソフトはTeraTermと仮定。

エディタでhello.hexを開いて内容をコピー。できれば末尾の改行だけはコピーしない。
monz8k_hexcopy

LOADを実行、アップロード待ちになるからウィンドウを右クリックしてペースト。このあとHEXファイル1行につきピリオド(.)をひとつ表示しながら読み込む。monz8k_hexup

簡易モニタ用アプリはカレントアドレスに関係なく8000から配置される。開始アドレスも8000と決まっている。だから実行方法はつねにCALL 8000。monz8k_hexcall

簡易モニタの機能はマジで簡易、というか安直。しかし何もないよりはずっとまし。もともとはhello, worldだけ付けて済まそうと思っていたのだから。

カテゴリー: アプリケーション, Z8000 | 1件のコメント

Z8000のクロス開発環境

SBCZ8002のプログラムを開発するとき最高の環境は、途中の説明を省略して結論だけいえば、VirtualBoxで動かすFedoraCore9のz8kgccだと思う。実際、SBCZ8002の簡易モニタとサンプルプログラムをその環境で開発した。以降、構築の手順を述べる。

●あらかじめダウンロードしておく配布ファイル
VirtualBox-こちらのサイトのパソコンに適合するパッケージ。
FedoraCore9-こちらのサイトのFedora-9-i386-DVD.iso。
z8kgcc-こちらのサイトのz8kgcc-jan-19-2009-linux-fc9.tar.bz2。

1.パソコンにVirtualBoxをインストール
一般的なアプリケーションのインストールだから説明を省略。

2.VirtualBoxにFedoraCore9をインストール
VirtualBoxでタイプがLinux、バージョンがFedora(32-bit)の仮想マシンを作成。
仮想マシンのフォルダ(パソコン側)へFedora-9-i386-DVD.isoを移動。
仮想マシンを起動し、仮想光学ドライブでFedora-9-i386-DVD.isoを選択。
インストーラの指示に従いFedoraCore9をインストール。最初の質問には[Skip]と答える。途中で追加ソフトウェアの選択があるが、[Fedora]のみ必要、それ以外は不要。

●パソコンと仮想マシンでファイルをやり取りする方法
通常は共有フォルダを介してやり取りするが、FedoraCore9が古すぎてその方法が使えない。かわりにUSBメモリを使う。

仮想マシンにUSBメモリをマウントする方法。
パソコンにUSBメモリを挿し、VirtualBoxで[デバイス]-[USB]-[<USBメモリ>]を選択。
z8kgcc_photo1

仮想マシンにマウントしたUSBメモリをアンマウントする方法。
仮想マシンでUSBメモリを右クリックし、[アンマウント]を選択。
VirtualBoxで[デバイス]-[USB]-[<USBメモリ>]の選択を外す。

3.FedoraCore9にz8kgccをインストール
USBメモリ経由でホームディレクトリにz8kgcc-jan-19-2009-linux-fc9.tar.bz2を置く。
以降のコマンドは「端末」から入力。
管理者の権限でz8kgcc-jan-19-2009-linux-fc9.tar.bz2を/へ展開し、権限を戻す。

su
<管理者パスワード>
tar jxvf z8kgcc-jan-19-2009-linux-fc9.tar.bz2 -C /
exit

.bash_profileを編集して環境変数にz8kgccのパスを追加。
エディタの起動方法は次のとおり。

gedit .bash_profile

赤字部分を書き加える。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/opt/z8kgcc-jan-19-2009/bin

export PATH

再起動またはログアウト/ログインで完了。

カテゴリー: Z8000 | 2件のコメント

SBCZ8002でhello,worldに成功

Z8002でhello, worldをやるぞって目標を立てたのが約2箇月前。案の定、間抜けな失敗を繰り返しながらも何とかゴールに辿り着いたので経緯を報告する。ハードウェアの現状を下に示す。Z8002の発熱が予想を超えたが、45℃以下にはとどまる模様。なお、このプリント基板には間違いがあり、現在、修正したものが工場を出て我が家へ向かっている。

sbcz8002_photo1

Z8002はアドレス信号がワード指定のバイト選択。すなわち、A1~A15でワードを指定し、A0で上位バイト/下位バイトを区別する。そのくらいは先刻ご承知だぜってことでメモリはうまく接続したが、体が慣れていなかったのかESCC(Z85230)の接続を間違えた。

sbcz8002_photo2

プリント基板のパターンの2箇所を切断し、電線で正しい接続に修正。結果として回路の間違いはここだけなのだが、間違いが1箇所だろうが100箇所だろうがプリント基板を作り直さなければならないことは同じ。そう考えると、これはむしろ痛恨のミスといえる。

sbcz8002_photo3

最初に実行してみたプログラムはリセットしてすぐ永久ループに入るやつ。Z8002のメモリアドレスは先頭ワードが無効、次のワードがフラグの初期値、次のワードが開始アドレス。で、偶数アドレスのコードを奇数ROMに持っておくヘンタイな構造。開発ツールを使うとこの構造をどう処理するかわからないから、ハンドアセンブルして書き込みソフトへ手入力。何度か暴走させたのちハンドアセンブルのミスを発見、修正して成功。

sbcz8002_photo4

ここからはESCCと格闘。コマンドチェインで初期化するやりかたはZ80 SIOと同じ、コマンドの働きもZ80 SIOとそっくりなんだけど、設定と同時に設定を有効にしてはいけないなど微妙に違うし、マニュアルのところどころに誤植がある。こうした罠に足をとられ、こけつまろびつしながらSCC初期化ワークシートを埋めた。これ、ザイログのアプリケーションズリファレンスに付いてるやつ。1970年代のみんなも悩んだんだろうね。

sbcz8002_photo5

hello, worldを表示するプログラムは、さすがにハンドアセンブルというわけにはいかなくてLinuxのクロスアセンブラを使った。ただし、この時点ではHEXファイルを作る方法がわからなかったし、もし作れても偶数/奇数コードの振り分けができないから、リスティングを見て書き込みソフトへ手入力。動かなかったらこのひどい力仕事をやり直し。

sbcz8002_photo6

数回のやり直しを経てhello, worldが表示され、続いてエコーバックテストにも成功。このプログラム、出来上がったものを見ると何てことはなくて、頑張れば誰にでも書けそうな感じ。問題は、正しいプログラムが正しく動くとは限らない状況で、頑張れるかどうかだよね。徒労に終わるかもしれない作業をちゃんとやれるのも才能だと思う。

sbcz8002_photo7

その後、Linuxのクロス開発ツールを徹底的に調べ上げ、現在はC言語のソースから直接ROMイメージを作る方法までわかっている。そのへんとハードウェアの詳細は、のちほど改めて紹介する。この投稿は、とりあえず、こんなに頑張ったんだぜって言うのが目的。hello, worldを成し遂げたんだから、そのくらいは認めてもらいたい。そして、修正したプリント基板が届き、最終確認ができたら、予告どおりお祭り騒ぎだぜ。

カテゴリー: Z8000 | コメントをどうぞ