2021年5月19日水曜日

Z280MB 組み立て

 GWを目一杯使って、Z280ボードを組み立てました。


16bit CPUは配線量が多く、老眼が進んできている自分にはかなりきついです。特にPLCCソケットのピンへのはんだ付けは、線同士が重なるので見づらくて正直あまり好きではありません。よく順番を考えながらはんだ付けしていかないと、あとで後悔します。白のラッピングワイヤがデータバス、オレンジがアドレスバス、青がバス制御とその他の信号ラインです。


ユニバーサル基板で作るのは、自分にはそろそろ限界なのかもしれません。次回はPCBを起こせるようになりたいものです。

このMPUボードは、CPUクロックが12MHz、SRAMが256kバイト、EEPROMが16kバイトの構成です。ROMは実際には2Mビット×2なのですが、そんなにもいらないので、16kバイト分だけ使えるようにしてあります。リセット直後は、64kバイトのメモリ空間にはROMしか現れず、MMUをつかってアドレス上位に置かれているSRAMをマッピングして使えるようにします。

現状では、UARTから”hello world"が出力できているレベルで、MMUなどの確認はできていません。回路図は動作が確認できたら公開するつもりです。



2021年5月2日日曜日

Z280のZ-BUS

当初、Z280を8-bitのZ80-Busで動かそうと思っていたのですが、はんだを始めたら調子が乗ってきたのと、あとで変更するのが結構面倒なことに気づいたので、はじめから16-bitのZ-BUSで行くことに変更しました。


Z-BUSでもアドレスとデータバスはマルチプレクスされているので、アドレス用の8-bitラッチが2個必要になります。
データバスの接続は、偶数番地がAD15-AD8に、奇数番地がAD7-AD0になります。バイトリードの場合は、Z280がAD15-AD0の上位と下位を選んでデータを読み込んでくれますが、バイトライトの場合は、AD15-AD0の上位と下位には同じデータが出されますので、A0で書き込むメモリチップを選択をする必要があります。ワードのリードライトでは、Z280がリトルエンディアンなので、上位と下位を入れ替えてくれます。

B/Wはバイトかワードアクセスを示し、R/Wはリードかライトを示します。/DSはデータの読み書きのタイミングをとる信号です。Z8000のZ-BUSと違うところは、メモリアクセスを示す/MREQがありません。ST3-ST0をデコードしてメモリアクセスかを判断する必要があり、1000と1001の場合がメモリアクセスを示します。

Z-BUSでのメモリアクセスのタイミングは下図のようになっています。Z8000と同じです。

2021年4月19日月曜日

Z280のクロック

 Z280のクロックは少し複雑です。チップからは、XTALI, XTALO, CLK の3本もクロック関係のピンが出ています。

Z280は内部にクロックオシレータを持っており、水晶振動子をXTALIとXTALOにつなぐか、XTALIに外部からクロック信号を入れると動作することになっています。内蔵オシレータからのクロックは1/2に分周され、CPUクロックになります。今手持ちのCPUは12MHz品なので、クロックは24MHzまで入れることができます。

外部バスのクロックは、CPUクロックを更に1/2, 1/4分周にすることができ、CLKピンから出力されます。デフォルトでリセット後は1/2にセットされるのですが、この分周比は、データシートによるとソフトウェアからでは変更できません。

これは、アクセススピードが遅いメモリやI/Oを接続することを考慮したものなのでしょうが、Z280を最速で動かすには、バスクロックをCPUクロックと同一にする必要があります。厄介なことに、この分周比を変更できるのは、リセット時にデータバス経由で値を渡す方法だけのようです。

2021年4月10日土曜日

Z280のZ80-Bus

 

Z280のZ80 Busですが、その名前と違い、メモリやI/Oと接続するための信号やタイミングはZ80とは完全に同じではありません。8-bitバスという点では同じなのですが。


データD0-D7とアドレスA0-A7は、AD0-AD7としてマルチプレクスされているので、アドレスを保持するためにZ8000と同じようにアドレスラッチが必要です。/ASは、AD0-AD7がアドレスを出していることを示す信号です。
/OEと/IEは、ADが出力か入力を示す信号で、ちょっと使いみちが思いつきませんが使わなくても大丈夫そうです。

Z80と違い、命令のフェッチでもデータのリードライトでも同じタイミングで行われます。

メモリリードでは、/MREQがLになり、続いて/RDがLになります。データはT3の立ち下がりで読み取られます。

メモリライトでは、/MREQがLになり、AD0-AD7にデータが出力され、続いて/WRがLになります。

よくある非同期バスなので、スタティックメモリをつなぐだけなら大して難しくはなさそうです。

I/Oアクセスは、タイミングは違えどメモリとほぼ同じようです。Z280には主要な周辺I/Oが組み込まれているので、I/Oアクセスの事はしばらく忘れておきます。


参考文献 
 Z280 PRELIMINARY Technical Manual
 Z280 Product Specification

2021年4月3日土曜日

Z280のリセット

Z280の資料を読み始めました。まずはリセットあたりから。

Z280のリセットは少々複雑です。 ハードウェアリセットは、/RESETピンを128クロックサイクルの間、Lにすることでかかります。 
外部バスをZ-BUSかZ80 Busにするかは、このリセット時にOPTピンで決定します。

 Z80 Bus --- opt = L 
 Z-BUS ----- opt = H or NC

/RESETピンをHに戻すときに、/WAITピンがLになっているとAD0-AD7ピンからデータを読み込んでBus Timing and Initialization Register を初期化できます。AD6をHにしておくとブートストラップモードになり、リセット後にUARTから256バイト読み込んで実行します。ROMレスなシステムを作るの使う機能で面白そうですが、スタンドアロンで動作できなくなってしまうので、今回は使わないつもりです。
他にも、メモリアクセス時のウエイト数を設定したり、外部バスクロックの設定ができたりするのですが、初期化に余分な回路が増えるため、この初期化方法は使わないことにします。

/RESETがLになっている間は、AD0 - AD15, A16 - A23 はHi-Z で、他の制御出力ピンはHになります。

参考文献 
 Z280 PRELIMINARY Technical Manual
 Z280 Product Specification

2021年3月30日火曜日

Zilog Z80280

 Z8000へのPCC移植がちょっと行き詰まってしまい、気分転換にはんだ付けがしたくなってきました。今回の目標はZilog の Z280を動かすことです。


この石は中国から購入したのですが、ほんまもんなのかがわかりません。時間かけたあげく無駄に終わる可能性もあります。前回のZ8002も中国から購入したのですが、(本当に10MHz品かは別として)こちらは動作しました。偽物を掴まされてたとしても、それはそれで楽しいので、手をつけてみます。

Z280は、Z80とコードレベルで互換性がある16bit CPUです。単純にCPUなわけではなく、MMUやDMA、タイマ、シリアルポートなどを集積したかなり豪華な構成になっています。メモリスペースはMMUを通して、64kByteから16MByteまで拡張されています。外部バスは、16bitのZ-BUSモードか8bitのZ80 Busを選べるようになっています。

もちろん、Z280の性能を活かし切るにはZ-BUSで使うことになるのですが、配線量が増えるし、偽物だったときの精神的ショックを抑えるため、まずはZ80 Busで動かしてみたいと思います。


2020年12月26日土曜日

Z8000にPortable C Compilerを

かなりブログの投稿をさぼっていたのですが、PCCをZ8000に移植(対応?)させようと格闘しています。 現在挑んでいるのは、最新のPCC1.1.0ではなく、70年代のV7 UNIXに含まれていたANSI C 以前のPCCです。 
作業を単純化するため、ノンセグメントモードだけに対応しているので、実質Z8002用です。 過去には、i8086, MC68000 と共にZ8000版も有ったようなのですが、ネット上を探し回りましたが見つからず、現在では失われてしまっているようです。 まあ、40年もまえのことなので仕方がないですね。  
現在は、アーキテクチャの似ているPDP-11版をベースに、Z8000のコードを吐けるよう段階的に書き換えていっています。  

下は引数を2つ取って足し算をして返すだけの関数をコンパイルした例です。 

 C言語
add(a, b) int a, b;
{
        a += b;
        return a;
}
Z8000アセンブリ
	.data
	.text
	.globl	_add
_add:
	call	csv
	sub	r15,#F1
	ld	r2,4(r14)
	add	r2,6(r14)
	ld	4(r14),r2
	ld	r2,4(r14)
	jp	cret
	jp	cret
	.F1 = 0.
	.data
最適化は全くされていないので無駄が多いコードですが、正しくアセンブリを出力できるようになってきています。
コンパイラの作業が終わっても、次はアセンブラとリンカが必要なので、まだまだ時間が掛かりそうで気が遠くなります。いつか公開できる日が来ることを祈りつつ。