2019年6月22日土曜日

Z8001ボードの回路図

今回作ったZ8001ボードの回路図と写真をさらしておきます。回路図は、はんだ付けしながら間違いに気づいて変更した箇所もあるので、このままでは動かないかもしれません。おそらくCPUを手に入れて作ってみようとする酔狂な人はいないと思うので、大丈夫だとは思いますが。

回路図
  Z8001MB CPU
  Z8001MB Memory
  Z8001MB I/O

仕様
 CPU   Z8001A
 クロック 6MHz
 メモリー   SRAM 256kB  
      ROMなし Atmega164Pによるブートコード書き込み 


写真にある空のICソケットは、Z8010 MMUを実装しようとして失敗した残骸です。外すのが面倒だったのでそのままにしてあります。そのうちに再挑戦するつもりです。
回路図にあるZ8536 CIO はまだ実装していません。タイマーとパラレルポートはあると便利なので、そのうちつなぐ予定です。

Z8001のアセンブリ言語

GNU asで、Z8001のアセンブリコードを書く際の注意点を書き留めておきます。


セグメントアドレス


 アドレスを直打ちする場合は、アドレスのbit31を1にする必要があります。そうしないと、アドレスの上位2byteが短縮アドレスとして扱われてしまいます。アドレスをラベルで指定する場合は、この問題はありません。


例えば

    ld     r0, 0x01000008

の場合、アセンブルされたコードは、

    ld        r0, 0x0100
 addb  rl0, #xx  

のように、アドレスの上位2byte が短縮アドレスになり、下位2byteは別の命令になってしまいます。
バクなのか、そういう仕様なのかはわかりませんが、これで2日間ほどはまりました。
ちなみに、asでは、セグメントアドレスを <<セグメント番号>> で表記できません。

ダイレクトアドレッシング


 セグメントモードだと、アドレスが32bitになってしまい、アドレス指定に必ず 4byte 使われてしまいます。なので、変数はメモリ上に置かず、できるだけレジスタに置いた方が、アドレス指定に消費するメモリが少なくなります。レジスタはZ80に比べたら山のようにあるので問題はないでしょう。
 変数をメモリ上に取るときは、間接アドレッシングを使った方がメモリ効率は良さそうです。ローカルな変数は、Cのようにスタック上に置いた方が良いのかもしれませんが、アセンブリ言語で管理するのは面倒な気もします。

間接アドレッシング


 Z8001の場合、R0〜R7は、上位下位に分けて8bitレジスタとして使えるので、間接アドレッシングを使うなら、RR8以降を使ったほうがよさそうです。RR14はスタックポインタとして使うので、RR8, RR10, RR12を使うことができます。Z80のIX,IY プラス 1レジスタと考えると、ちょっと得した気分になれます。

2019年6月6日木曜日

Z8010MMU メモ

Twitterに書いたのですが、Z8010 MMUをせっかく手に入れたので繋いでみたところ、思っていたようには動作しませんでした。データシートを読んだり動かしてみてわかった事などを、忘れないよう自分用に書き留めておきます。

やったことは、Z8001の起動用コードをSRAMに書き込むため、Atmega164PからZ8010を経由してアドレスを出そうとしました。

・Z8010は高機能なアドレスラッチではない
 アドレスとセグメント番号を出してASをかけると、ラッチしてアドレスを出してくれると思っていたのですが、それだけではアドレスを出してくれません。Z8010は、Z8001からでるST0 - ST3の信号を見ていて、メモリアクセスの場合だけアドレスを出すようです。
 当たり前といえば当たり前なのでが、てっきり特殊I/Oデバイスとしてのアクセスのためだけに使われている、と思っていのが間違いでした。

・クロックに同期した信号が必要
 これも上と同じく思い違いから来た失敗です。Z8010は、Z8001と同じようにクロックに合わせてアドレスを乗せたり、ASやDSを操作しないと正しく動作しないようです。
必要もないのにクロックを繋がせたりはしないですね。


・単純にRESETをLowにしただけではダメ
 Z8010をリセットするのにRESETを単純にLowにしただけでは、初期化されますがDisableの状態になり働きません。これは、MMUを複数つなぐための仕様のようです。EnableにするにはCSを同時にLowにする必要があります。

・RESETをかけるとアドレス透過モードになる
 RESETとCSをLowにすると、「Z8010はリセットされ透過モードになり、アドレスを素通しする」と、データシートに書かれているのですが、これが未だ謎な点です。ラッチした状態でアドレスを出してくれるのか、本当にバイパスするだけなのかが読み取れません。
Atmega164Pで必要な信号を作ってZ8010経由でメモリに書き込もうとすると、AD0 - AD15にアドレスに続いて書き込みデータを乗せDSをLowにすると、アドレスが書き込みデータに置き換わってしまいます。

これらの情報は自分以外には全く役に立たないでしょうが、また何が判明したら追加していきます。