Z80ボードにオリジナルモニタ [Z80]
8085用に作ったモニタをZ80に移植。
まずは8080 -> Z80のニーモニックコンバータを捜す。
いくつかあるが意外とない。
一つ試してみたがまともに変換しない。
古いソフトは1行80桁までしか認識しないとか、日本語コメントを使っているがするがそれが悪さするとかためにあるけどその辺かな?
と思いつついちいち検証していくのも時間がかかるので、エディタで検索置換を駆使して力技で変換していく。
あとはシリアルが8251なのをZ80SIOのものに置き換え。
8085ボードは8085のRST7.5,6.5,5.5割込を使っているので、ブート時に設定しているのをZ80のモード2設定に変更。
ぐらいだろうか?
Z80に変更だからといって、Z80固有の命令を使って書き直すなどということまではしない。
PICのファームは基本同じだが、10msインターバルタイマ出力は8085ボードはRST7.5に入れている関係でH出力にしていたのをL出力に変更。もっともZ80ボードでは使用していないが。
Z80基板も新しく作り直した。
コネクタからの配線を、1.27mmピッチ1列のパターンにいったん並べ直して…、というのをやめている。これはメモリボードも同様に修正している。
あとは4隅のホールパターンを変更ぐらいかな?
このボード、Z80SIOの2chのうち片方を10Pヘッダにだしていて一応PCのCOMポート配列にあわせているが、RS232レベル変換しているわけではないのでPC用COMポートケーブル使って直接COMポート接続ができるわけではない。
スペースに余裕があるのでMAX232でも載せれば良かったかな?
まずは8080 -> Z80のニーモニックコンバータを捜す。
いくつかあるが意外とない。
一つ試してみたがまともに変換しない。
古いソフトは1行80桁までしか認識しないとか、日本語コメントを使っているがするがそれが悪さするとかためにあるけどその辺かな?
と思いつついちいち検証していくのも時間がかかるので、エディタで検索置換を駆使して力技で変換していく。
あとはシリアルが8251なのをZ80SIOのものに置き換え。
8085ボードは8085のRST7.5,6.5,5.5割込を使っているので、ブート時に設定しているのをZ80のモード2設定に変更。
ぐらいだろうか?
Z80に変更だからといって、Z80固有の命令を使って書き直すなどということまではしない。
PICのファームは基本同じだが、10msインターバルタイマ出力は8085ボードはRST7.5に入れている関係でH出力にしていたのをL出力に変更。もっともZ80ボードでは使用していないが。
Z80基板も新しく作り直した。
コネクタからの配線を、1.27mmピッチ1列のパターンにいったん並べ直して…、というのをやめている。これはメモリボードも同様に修正している。
あとは4隅のホールパターンを変更ぐらいかな?
このボード、Z80SIOの2chのうち片方を10Pヘッダにだしていて一応PCのCOMポート配列にあわせているが、RS232レベル変換しているわけではないのでPC用COMポートケーブル使って直接COMポート接続ができるわけではない。
スペースに余裕があるのでMAX232でも載せれば良かったかな?
Z80でGUPPYボード [Z80]
製作しているボードはGUPPYシリーズに規格をある程度あわせているのだが
そのGUPPYボードの紹介。
(1)GPY-01
4MHzのZ80Aと8255AがのったCPUボード。
64Kbitのメモリを2個載せることができてオプション。
(2)GPY-13
キーボード/ディスプレイIF、8279ボード。
これを使って昔ながらの16進キー、7Seg.LEDのシステムでも作ろうかと思うが
こちらで作っているCPUボードはアドレスデコードを端折ってCSにA7をつっこんでるだけ。
それに対してこのボードは20H~3FHの範囲で選択。
完全に被ってそのままでは使えない。
(3)GPY-07
64K×4のDRAM2個で64KBメモリボード。
この手の制御基板システムは、1枚でCPU+メモリ+αとスタンドアローンで動かしオプションI/Oを別ボードで、というのが普通だと思うので8bitのアドレス空間を占有してしまうボードも珍しいかな。
一応バンクメモリ方式にもできるので、データ保存用のメモリ拡張がが主目的か?
(4)GPY-45
AD75004のDAコンバータボード。
オプションでもう一つAD75004を搭載できる。
これは取説がないので詳細は不明。
今回はGUPPYバスにある程度あわせたので、GUPPYも使うことができるという検証で
(5)GPY-06
ROM/RAMボード
を使ってみる。写真は既にROM/RAM搭載済みだが製品はオプション。
これは64KbitのROM、あるいはSRAMを4個搭載できるメモリボード。
74LS138で64KBのメモリ空間8等分したチップセレクト信号を生成しているが
デフォルトでは
2000H~
4000H~
6000H~
A000H~
となっているので、パターンカットして
1個目のメモリを0000H~1FFFFHとなるようにジャンパを切り替える。
動作確認用ソフトはTinyBasic。
RAMはA000H~BFFFHにするのでメモリロケーションを変更してアセンブル。
ROMは2764。中華製の安価なROMライタTL866Aで書き込むのだが、このライタ用書き込みソフト、メーカ名、ROMの型番と選択させるのだけど各個の正確な情報は持っていない模様。
どれを選んでも書き込み電圧は12.5Vになっている。2764タイプが12.5VになったのはCMOS品からだったように思うのだが…
書き込み電圧を21Vに設定してROM焼き。問題なく動作。
そのうち、いずれかのI/Oでも動作検証してみたいと思う。
そのGUPPYボードの紹介。
(1)GPY-01
4MHzのZ80Aと8255AがのったCPUボード。
64Kbitのメモリを2個載せることができてオプション。
(2)GPY-13
キーボード/ディスプレイIF、8279ボード。
これを使って昔ながらの16進キー、7Seg.LEDのシステムでも作ろうかと思うが
こちらで作っているCPUボードはアドレスデコードを端折ってCSにA7をつっこんでるだけ。
それに対してこのボードは20H~3FHの範囲で選択。
完全に被ってそのままでは使えない。
(3)GPY-07
64K×4のDRAM2個で64KBメモリボード。
この手の制御基板システムは、1枚でCPU+メモリ+αとスタンドアローンで動かしオプションI/Oを別ボードで、というのが普通だと思うので8bitのアドレス空間を占有してしまうボードも珍しいかな。
一応バンクメモリ方式にもできるので、データ保存用のメモリ拡張がが主目的か?
(4)GPY-45
AD75004のDAコンバータボード。
オプションでもう一つAD75004を搭載できる。
これは取説がないので詳細は不明。
今回はGUPPYバスにある程度あわせたので、GUPPYも使うことができるという検証で
(5)GPY-06
ROM/RAMボード
を使ってみる。写真は既にROM/RAM搭載済みだが製品はオプション。
これは64KbitのROM、あるいはSRAMを4個搭載できるメモリボード。
74LS138で64KBのメモリ空間8等分したチップセレクト信号を生成しているが
デフォルトでは
2000H~
4000H~
6000H~
A000H~
となっているので、パターンカットして
1個目のメモリを0000H~1FFFFHとなるようにジャンパを切り替える。
動作確認用ソフトはTinyBasic。
RAMはA000H~BFFFHにするのでメモリロケーションを変更してアセンブル。
ROMは2764。中華製の安価なROMライタTL866Aで書き込むのだが、このライタ用書き込みソフト、メーカ名、ROMの型番と選択させるのだけど各個の正確な情報は持っていない模様。
どれを選んでも書き込み電圧は12.5Vになっている。2764タイプが12.5VになったのはCMOS品からだったように思うのだが…
書き込み電圧を21Vに設定してROM焼き。問題なく動作。
そのうち、いずれかのI/Oでも動作検証してみたいと思う。
Z80基板動作確認(2) [Z80]
Z80の続きです。
Z80SIOを使ったTinyBasicを拝借させてもらった古典電脳伝説の著者さんのブログで「電脳伝説」というのがあって、GranzBasicなるものを動かしていらっしゃるのでまたまた倣ってみました。
GranzBasicは、こんなおもちゃにはもったいないぐらいなものです。
せっかくというわけでもないが、少々手をいれてみた。
(1)アドレス配置を多少変更する
(2)送受信とも割り込みで処理する
(1)はまぁ、個人的な好みの問題にすぎないが、メイン処理、共通ルーチン、ドライバ関連をそれぞれまとめてマッピングを分ける。という事を完全ではないが少しだけ修正。
コードとデータは分離するというのもあるが、これもほんの少しだけ。三角関数のテーブル等細々あって全部やるのは手間暇かかるため。
関連するデータがコードのすぐそばにあると、エディタの1画面内に収まったりしてみやすいとか、相対アドレッシングを使用しているので近くにないとダメとか、そういった理由だろうが個人的にはなるべくわけたい。
あとは、8080系は最初の256バイトがベクタエリアでもあるし、CP/M等特別な領域として使われることが多々あるので、そこにコードを入れるのはなるべく避ける。
(2)は昔の遅い8bitのシングルタスクのシステムで送信を割り込みで行う意味はあまりないかもしれないが、これもまぁ趣味みたいなもの。
同時にリングバッファの処理をなるべく簡略化したいので送受信ともバッファを256バイトにする。
これでメモリをフルに使うようなプログラムを書くことはまずないだろうから、バッファを大きくとっても問題なし。
あとはバッファの配置を256バイト境界にしておけばベース+オフセットの計算をすることなく、ベースの上位バイトをHに、Lにオフセットを入れればすむので簡単。
送信割り込みに関してだが、
送信割り込みを使ったシリアル送信のポイントは通常時は送信割り込み禁止、送信開始時に許可して送信完了で送信割り込み禁止に戻すというのが普通(?)だと思うが、実際Z80SIOのデータシートをみるとトランスミッタバッファエンプティ時に割り込みがかかるとなっていて、つまりエンプティになった時に割り込みがかかるエッジ判定ではない。
これは多くのシリアルIC、あるいはマイコン内蔵シリアルがそうなっているような気がするが、MC6801がエンプティになった時に、とエッジ判定となっている。
割り込みがレベル判定なので
・送信データがなかろうとエンプティフラグがたっているので送信割り込みがかかる
↓
・送信データがないので何もせず割り込みを抜ける
↓
・エンプティフラグがたったままなのですぐに送信割り込みがかかる
と延々繰り返す事になり通常動作に入らなくなると思われる。
でいつもやっているように、つまり
・送信バッファに送信待ちデータがなくSIOも送信バッファエンプティなら
SIOに直接データを書き込み送信割り込みを許可する
・送信割り込みがかかったが送信待ちデータがなければ送信割り込みを禁止にする
と組んでみて動作確認もしたのだが
Z80SIOには「保留中の送信割り込みをリセットする」という機能があって、なんのこっちゃ??と思っていたが後でそういうことか!?と気付いて、
・常に送信割り込み許可にしておく
・送信割り込みがかかり送信データがなければ「保留中の送信割り込みリセット」
に変更してみたがこちらで問題なかった。
データシートの説明は時々???となる言葉や表現がよくあり、特に海外のものは日本語訳が???だったりするし、Z80SIOのような高機能なものは文の量も多く解読に時間がかかってしまうことも多々ある。読解力がないだけかもしれないが(笑)
動作検証として、これまたasciiart.basをそのまま使わせてもらいました。
問題なく動作していると思われる。
一応、Z80ボードは修正なくほぼフィクスなので回路図です。
PICには3.3Vの電源出力があって何もせず解放ピンにしているが、データシートにはパスコンつけろ的な事書いてあるので再度基板つくる事があれば追加するかな?
USB給電なのでPCとつなげば即立ち上がります。
PC側の接続認証に多少時間がかかるので、ものによってはブートメッセージが表示されない事があります。
ねんのためスマフォのACアダプタ(micro-Bタイプ)が使えるようにしている。ただし自動認証ではなくジャンパ切替。
今時は2.1ΦジャックのACアダプタよりこっちの方が手に入れやすいと思われるので。
ただ、今後はType-Cが主流になるのかな?Type-Cの給電専用コネクタはまだみたことないが。
メモリボードの回路図はこれです。
色々想定を盛り込みすぎていて
・ストローブとして80系はMREQ、68系はEを想定していて論理が逆なので切替
・アドレスの下位ROM上位RAM(主に80系)、下位RAM上位ROM(主に68系)の切替
・ROM側をRAMと切替て全RAM可能なように
それぞれジャンパで切り替えられるようにしている。
それぞれの基板をおこしてもよかったのかもしれないが…
全RAMは先を考えてで、ようするに別の手段でCPUリセット中あるいはHALT中にブートローダをRAMに仕込んで、というやつです。
UV-EPROMは消去に手間暇がかかるので。
ただ、その仕込みはもっと時間がかかるので本当にするかどうかは…
Z80SIOを使ったTinyBasicを拝借させてもらった古典電脳伝説の著者さんのブログで「電脳伝説」というのがあって、GranzBasicなるものを動かしていらっしゃるのでまたまた倣ってみました。
GranzBasicは、こんなおもちゃにはもったいないぐらいなものです。
せっかくというわけでもないが、少々手をいれてみた。
(1)アドレス配置を多少変更する
(2)送受信とも割り込みで処理する
(1)はまぁ、個人的な好みの問題にすぎないが、メイン処理、共通ルーチン、ドライバ関連をそれぞれまとめてマッピングを分ける。という事を完全ではないが少しだけ修正。
コードとデータは分離するというのもあるが、これもほんの少しだけ。三角関数のテーブル等細々あって全部やるのは手間暇かかるため。
関連するデータがコードのすぐそばにあると、エディタの1画面内に収まったりしてみやすいとか、相対アドレッシングを使用しているので近くにないとダメとか、そういった理由だろうが個人的にはなるべくわけたい。
あとは、8080系は最初の256バイトがベクタエリアでもあるし、CP/M等特別な領域として使われることが多々あるので、そこにコードを入れるのはなるべく避ける。
(2)は昔の遅い8bitのシングルタスクのシステムで送信を割り込みで行う意味はあまりないかもしれないが、これもまぁ趣味みたいなもの。
同時にリングバッファの処理をなるべく簡略化したいので送受信ともバッファを256バイトにする。
これでメモリをフルに使うようなプログラムを書くことはまずないだろうから、バッファを大きくとっても問題なし。
あとはバッファの配置を256バイト境界にしておけばベース+オフセットの計算をすることなく、ベースの上位バイトをHに、Lにオフセットを入れればすむので簡単。
送信割り込みに関してだが、
送信割り込みを使ったシリアル送信のポイントは通常時は送信割り込み禁止、送信開始時に許可して送信完了で送信割り込み禁止に戻すというのが普通(?)だと思うが、実際Z80SIOのデータシートをみるとトランスミッタバッファエンプティ時に割り込みがかかるとなっていて、つまりエンプティになった時に割り込みがかかるエッジ判定ではない。
これは多くのシリアルIC、あるいはマイコン内蔵シリアルがそうなっているような気がするが、MC6801がエンプティになった時に、とエッジ判定となっている。
割り込みがレベル判定なので
・送信データがなかろうとエンプティフラグがたっているので送信割り込みがかかる
↓
・送信データがないので何もせず割り込みを抜ける
↓
・エンプティフラグがたったままなのですぐに送信割り込みがかかる
と延々繰り返す事になり通常動作に入らなくなると思われる。
でいつもやっているように、つまり
・送信バッファに送信待ちデータがなくSIOも送信バッファエンプティなら
SIOに直接データを書き込み送信割り込みを許可する
・送信割り込みがかかったが送信待ちデータがなければ送信割り込みを禁止にする
と組んでみて動作確認もしたのだが
Z80SIOには「保留中の送信割り込みをリセットする」という機能があって、なんのこっちゃ??と思っていたが後でそういうことか!?と気付いて、
・常に送信割り込み許可にしておく
・送信割り込みがかかり送信データがなければ「保留中の送信割り込みリセット」
に変更してみたがこちらで問題なかった。
データシートの説明は時々???となる言葉や表現がよくあり、特に海外のものは日本語訳が???だったりするし、Z80SIOのような高機能なものは文の量も多く解読に時間がかかってしまうことも多々ある。読解力がないだけかもしれないが(笑)
動作検証として、これまたasciiart.basをそのまま使わせてもらいました。
問題なく動作していると思われる。
一応、Z80ボードは修正なくほぼフィクスなので回路図です。
PICには3.3Vの電源出力があって何もせず解放ピンにしているが、データシートにはパスコンつけろ的な事書いてあるので再度基板つくる事があれば追加するかな?
USB給電なのでPCとつなげば即立ち上がります。
PC側の接続認証に多少時間がかかるので、ものによってはブートメッセージが表示されない事があります。
ねんのためスマフォのACアダプタ(micro-Bタイプ)が使えるようにしている。ただし自動認証ではなくジャンパ切替。
今時は2.1ΦジャックのACアダプタよりこっちの方が手に入れやすいと思われるので。
ただ、今後はType-Cが主流になるのかな?Type-Cの給電専用コネクタはまだみたことないが。
メモリボードの回路図はこれです。
色々想定を盛り込みすぎていて
・ストローブとして80系はMREQ、68系はEを想定していて論理が逆なので切替
・アドレスの下位ROM上位RAM(主に80系)、下位RAM上位ROM(主に68系)の切替
・ROM側をRAMと切替て全RAM可能なように
それぞれジャンパで切り替えられるようにしている。
それぞれの基板をおこしてもよかったのかもしれないが…
全RAMは先を考えてで、ようするに別の手段でCPUリセット中あるいはHALT中にブートローダをRAMに仕込んで、というやつです。
UV-EPROMは消去に手間暇がかかるので。
ただ、その仕込みはもっと時間がかかるので本当にするかどうかは…
Z80基板動作確認 [Z80]
さて、できあがった基板だが8085の基板は8251のフットプリントを32pin DIPにしてしまうという大ボケをやらかして使うことはできない(笑)。
6303の方もいくつかミスがあり、パターンカットしてジャンパ飛ばししてデバッグ中。
1発オッケーだったのがZ80基板。
部品実装したのがこれ。
何しろ主要な部品はZ80CPU、Z80SIO、PICのみのシンプルな構成。
Z80SIOのアドレスデコードを手抜きしているのでTTLもなし。
同じく部品実装したメモリボード。
このメモリボードは使い回すことを考えすぎて、色々ジャンパが付いているがこの基板はワイヤを半田付けしてしまって80系のROM(0000H~)とRAM(8000H~)専用に。
この2枚の基板の接続はフラットケーブルでもいいけれど、今回はこれ。
実はこれらのボード、昔日本コムネットというところからでていた、GUPPYシリーズのマイコンボードに規格を合わせている。
GUPPYバスはZ80の信号がほぼそのままでていて、M1とかRFSHまででているが、Z80専用システムにするつもりはないし、そうだとしても実際使わないだろうから別の信号にわりあてた。
68系のボードもでていたのだが、どういった割り当てになっていたのかは不明。
GUPPYボードが使えるかどうかはまた別の機会にと思っているが、やるかどうかは…
上の写真のボードはGUPPYのボードを5枚入れられるラックのマザー部分を取り出した物。
今回のZ80ボードとメモリボードを搭載するとこんな感じになる。
動作確認だが、「古典電脳物語」という本で使われていたAKI-80版のTinyBASICを使わせてもらいました。
変更点はAKI-80版のものは、シリアルのボーレートをCTCで生成しているがこちらはPICで。
あとはZ80SIOのアドレスが違うぐらいだが、SIOはチップセレクトにA7を入れてるだけだし、CTCの設定も存在しないI/OにOUTするだけなので、これが16bit以上のCPUなら無効なアドレスをアクセスすると例外が発生したりするが、単純な昔の8bitCPUはそこまでしないのでたぶん無修正でも動作するはずだが、一応修正しておいた。
そしてすんなりと動作しました。
使用したCPUは東芝のTMPZ84C000AP-6。
CPUクロックはPICで生成しているが約6MHzなので、BバージョンのZ80でC-MOS版。
実際は6.3MHzほどでていてオーバークロック気味だが、特に問題なし。
実はこの回路、クロックを特に何も処理していなくてGUPPYマザーが全信号を10Kでプルアップしているのでクロックもそうなってしまっているが、N-MOS版のZ80はクロックに対する要求がシビアなのでたぶん動かないだろうなぁとザイログとSHARPのN-MOS6MHzのものを用意したが、案の定かなり不安定。
C-MOS版のZ80は確かTTLレベルでよかったはず。
したがってこのボード、C-MOSのZ80しか動かないことになる(笑)
試したCPUがこの3つ。
CPUを入れ替えて電源を入れた(USB接続)しただけの動作結果がこれ
最初の起動メッセージがC-MOS版のもの。次のやつがN-MOS版でまともに表示せず暴走気味に。
6303の方もいくつかミスがあり、パターンカットしてジャンパ飛ばししてデバッグ中。
1発オッケーだったのがZ80基板。
部品実装したのがこれ。
何しろ主要な部品はZ80CPU、Z80SIO、PICのみのシンプルな構成。
Z80SIOのアドレスデコードを手抜きしているのでTTLもなし。
同じく部品実装したメモリボード。
このメモリボードは使い回すことを考えすぎて、色々ジャンパが付いているがこの基板はワイヤを半田付けしてしまって80系のROM(0000H~)とRAM(8000H~)専用に。
この2枚の基板の接続はフラットケーブルでもいいけれど、今回はこれ。
実はこれらのボード、昔日本コムネットというところからでていた、GUPPYシリーズのマイコンボードに規格を合わせている。
GUPPYバスはZ80の信号がほぼそのままでていて、M1とかRFSHまででているが、Z80専用システムにするつもりはないし、そうだとしても実際使わないだろうから別の信号にわりあてた。
68系のボードもでていたのだが、どういった割り当てになっていたのかは不明。
GUPPYボードが使えるかどうかはまた別の機会にと思っているが、やるかどうかは…
上の写真のボードはGUPPYのボードを5枚入れられるラックのマザー部分を取り出した物。
今回のZ80ボードとメモリボードを搭載するとこんな感じになる。
動作確認だが、「古典電脳物語」という本で使われていたAKI-80版のTinyBASICを使わせてもらいました。
変更点はAKI-80版のものは、シリアルのボーレートをCTCで生成しているがこちらはPICで。
あとはZ80SIOのアドレスが違うぐらいだが、SIOはチップセレクトにA7を入れてるだけだし、CTCの設定も存在しないI/OにOUTするだけなので、これが16bit以上のCPUなら無効なアドレスをアクセスすると例外が発生したりするが、単純な昔の8bitCPUはそこまでしないのでたぶん無修正でも動作するはずだが、一応修正しておいた。
そしてすんなりと動作しました。
使用したCPUは東芝のTMPZ84C000AP-6。
CPUクロックはPICで生成しているが約6MHzなので、BバージョンのZ80でC-MOS版。
実際は6.3MHzほどでていてオーバークロック気味だが、特に問題なし。
実はこの回路、クロックを特に何も処理していなくてGUPPYマザーが全信号を10Kでプルアップしているのでクロックもそうなってしまっているが、N-MOS版のZ80はクロックに対する要求がシビアなのでたぶん動かないだろうなぁとザイログとSHARPのN-MOS6MHzのものを用意したが、案の定かなり不安定。
C-MOS版のZ80は確かTTLレベルでよかったはず。
したがってこのボード、C-MOSのZ80しか動かないことになる(笑)
試したCPUがこの3つ。
CPUを入れ替えて電源を入れた(USB接続)しただけの動作結果がこれ
最初の起動メッセージがC-MOS版のもの。次のやつがN-MOS版でまともに表示せず暴走気味に。