2005/06/06(月)Z80 MONITOR

Z80

[Z80]超簡単シリアル通信

このZ80ボードとのシリアル接続をどうしようかと思案したが結局、ELMさんのページから拝借して74HC04と抵抗だけでRS-232Cインターフェスを組んでみました。

Z80ですから、いまさらLEDをピカピカさせても面白くありませんからねぇ。カードエッジコネクタが手元にないので8255のI/O側からユニバーサルボードへ接続。接続には手元にあったPC用のIDEケーブルを流用。ユニバーサルボード側から電源を供給。+5の電源は定番の秋月アダプター

PCとのシリアル接続はSUNブレードサーバやCISCOのターミナル変換コネクタを流用です。RJ-45と基板への変換コネクタには、多分、大阪のディジットのジャンクであろうかドンピシャな物で仕上げてみました。

ソフトウェアだけのシリアル通信

マイコンの時代、プログラムはカセットテープに記録しました。今自分がやろうとしている事は既に知識としてあったし、8085には専用の命令と端子があります。しかし、実際アセンブラで組んでみると、送信ルーチンはともかく、受信ルーチンは結構シビアです。高々9600ボーだと何も考えずに1/9600とその半分の1/19200秒をWAITするサブルーチンを用意して8255のポートCから1と0を読み込んでシフトさせてみましたが、ボロボロと取りこぼしが発生。結局、最初のスタートビット後の1/19200やシフトルーチン内での1/9600とストップビット中の2/9600のディレイルーチンはそれぞれWAIT時間が異なるという(至極あたりまえな)結論に達しました。

しかし、1バイトのシリアル入出力ルーチンが出来上がってしまえば(とはいえ、かなりてこづった)あとは、簡単なモニタープログラムを書けば、Z80とはターミナルソフト(もちろんTera Term)で会話が可能となります。まるで、よちよち歩きの赤ちゃんが少しづつ話をする事が出来るかのように・・

簡易モニターがあれば

昔のモニターによくあるRAMへの書き込みコマンド'W'を実装した。W 3C00と入力すればあとはキーボードからプログラムを打ち込める。G 3C00と入力すればプログラムをコールしてまたモニタールーチンに帰ってくる。PC上でZ80のクロスコンパイラでプログラムを書き、最後に出来上がったHEXファイルをこの'W'コマンドに変換するプログラムhex2ttyも書いた。この時点で、この幼いZ80ボードとPCはモニターを通じてプログラムの書き込みと実行を自由自在に行えるのである。

TeraTerm万歳!

ソフトウェアでのループ待ちでシリアルデータを吐き出す訳でこの間はデータが全く受信できないのである。このモニターでは入力された文字をエコーバックするように作ったので、1文字入力後は1文字分(正確には11/9600秒)キー入力を受け付けない。手入力の時は気が付かなかったが、HEXファイルをモニターコマンドに変換して、TeraTermのSendFileコマンドで一気に書き込みを行うと、このエコーバック処理の為にボロボロになってしまった。やっぱりハンドシェイックは必要か?RTS/CTSのハードウェアフローを実装するしかないなぁ。と思いきや、なんとTeraTermのSerialPortのメニューにTransmit delayなる設定メニューを発見。恐る恐る30msec/charなどと設定して実行してみるとなんとこれが大成功。TeraTerm様万歳なのであった。

CでもOK?

Z80のフリーのCクロスコンパイラsdccでも開発は可能だ。試しにスタートアップルーチンを書けば、Cからputchar(),getchar()も使える。本当にオープンソースは素晴らしい。が、いい気になってちょっとprintf()とか使うと、一気にオブジェクトが1.5KBとかなってしまい、このボードのRAMサイズ1KBが恨めしい。

やっぱりZ80は楽しかった

この10日間は会社から帰ってきては、夜な夜なZ80のアセンブラをやった。Cも書いた。sdccのスタートアップルーチンではコンパイル後のリストファイルを見ながら、引数渡しの方法を試みた。楽しかった。モニター開発途中ではEE-PROM 2816がとっても役立った。ライターのTopMaxも大活躍だ。ありがとう昔のチップ達よ。充実した日々が送れた。ハンダテラピーは僅かだったがヤニの香りを楽しませてくれた。

Z80 MONITOR
Z80 MONITOR

  • monitor.lst

  • Intel HEXファイルをターミナルからの書き込みキー入力コマンドへ変換 hex2tty.c

  • sdcc用スタートアップルーチン crt0.s