Top Page Index About Link Mail Form ●このページの応用機器製作します |
2014.9.24
仕事で既存の Z80のシステムのプログラム変更の話がありました。基本的にハードウェアは変更せず、プログラムを修正して欲しいとのことでしたが、プログラムソースが無く、代わりに回路図を含んだ比較的詳しい仕様書があるという案件でした。
昔はやっていたとはいえ、今更 Z80のアセンブラとか書きたくなかったので、CPUを差し替える基板を作って新しくプログラムを書くのはどうかと提案しました。結果的に仕事としては流れてしまいましたが、最近の MCUで Z80をエミュレートしてみるとどうなるのか興味があったので作ってみました。
というわけでサクッと基板作成。MCUは NXPの LPC1115FBD48です。Cortex-M0 ARMで、今回は 48MHzで動かします。回路図をみるとわかりますが、GPIOを Z80の信号線としてつないであるだけです。
LPC1115は電源は 3.3Vで動かすので電源レギュレータを入れてあります。Z80のシステムは 5Vで動かしますが、LPC1115のほとんどの GPIOピンは 5Vトレラント入力なので、入力ピンに 5Vを加えても問題ありません。
また、逆に LPC1115からの出力信号レベルは 3.3Vとなりますが、この当時の Z80システムはほとんど LS TTLが使われているため、2.0V以上の電圧があれば十分に Highと認識されるので大丈夫です。
Z80のほとんどのピンをつないでありますが、今回は DMAに使う BUSRQ/BUSAKは未接続になっています。小さな規模の組み込みシステムではあまり使われることがないのでそうしてあります。PC-8001は DMAで画面表示していたとかあるかもしれませんが、それはそれ。
基板上のコネクタ CN1にはシリアル信号とリセット信号、UART ISP選択信号が出してあります。シリアル信号で MCUのフラッシュ書き換えやコントロールができるようにしてあります。スペースが余ったので LEDもつけてみました。
動作確認に使った中日電工の ND80Zです。30年前、学生時代にバイトして買ったもので、これがあるから今の自分があると言っていいかも。
基板上にジャンパー線とか走ってますが、わたしが改造した跡です。確か外部バス(基板下部のエッジコネクタ)にデバイスをつなぐ必要があったので RAMのアドレスデコードをフルデコードしたり、外部バス側から RAMを動作切り替えできるようにしたんじゃなかったかと。
というわけでソフトウェア開発中。基板上の Z80を抜いてエミュレート基板を入れてあります。ロジアナをつないでタイミングを確認している図。
今回の基板は Z80のクロック信号も一応つないであるのですが、結局使っていません。また、WAIT, RFSH, M1, INTも今のところは未使用です。
Z80のソフトウェア的なエミュレートはそれほど難しくはないものの、命令数が多いので確認にひたすら手間がかかります。今回はネットで見つけたエミュレータを移植しました。
Z80エミュレータは anotherlin/z80emuという物を使わせていただきました。
ND80Zの ROMは 2KB, RAMは 1KBなのでこれらのメモリーは使わず、エミュレート時は LPC1115の 8KBの内蔵RAMを使っています。起動時に ND80Zの ROMデータを内蔵 RAMにコピーし、以降はそれを読んで動作します。RAMの読み書きも内蔵RAMに対して行います。これにより、遅い外部バスアクセスをしなくなるので高速化できます。ND80Z上の RAMは一切使わないので抜いてしまっても動作します。
最終的に Z80の命令1個を1μSecくらいで実行できるようになりました。これであれば 4MHzの Z80と同等です。
ND80Zはカセットテープにプログラムコードをセーブ・ロードできるのですが、その信号タイミングが命令の実行クロックに依存してるので、このエミュレータではたぶんうまく動作しないでしょう。また、今現在は INT信号も使っていないのでデバッグのトレース動作もできません。今回はとりあえず 7SEG LEDとタクトスイッチで操作できるのでそれっぽいデモができればOKと。
BUSRQ/BUSAKを使えるようにした基板アートワークも書いてみた。今のところ作る予定は無いけど。
2015.6.27
臨時の仕事で昔懐かしい組込み用 Z80ボード GUPPYの修理を頼まれた。動かない原因がはっきりしないので Z80エミュレータ基板を載せて信号を確認する。結局、原因はパターンがサビて断線していた為のよう。置かれていた環境が海の近くだし、昔のフラックスの塩素か何かもせいもあったのかもしれない。