ちょっとTea Time!? CPM80の「MZ80化」を構想する!の巻き(本編)。 2025.9.6

ことはじめ
昔々、京都の寺町といえば大きな電気街でした。場所は四条寺町の寺町通の南側の約2ブロック。
二宮無線、谷山無線、ヒエン堂やその他一杯。電子パーツを扱う店も結構ありました。
嗚呼、懐かしの寺町電器街 - Kyoto Love. Kyoto 伝えたい京都、知りたい京都。

寺町へは中学生のときは、家から自転車でよくいきました。
(小学生のときは、一人で学校区からでることはできませんでしたから)。
距離的にも15分くらいかなあ〜。
駐輪場はないので、いつもはヒエン堂の横の道に止めていました。
当時はマイコンの黎明期。TK-80BS(TK80にBASIC基板が接続)や
MZ80(SHARPのマイコン)などのBASICが使えるものが置いてあり、
興味深く触っていました。当時のBASICの雑誌には

10 LET A=2

と代入にLETがつかわれていました。
それらに忠実に

10 LET A=2
20 LET B=3
30 LET C=A+B
40 PRINT C
50 END


などと、打ってみて実行して、モニターに結果が表示されると嬉しかったりしたことを覚えています。
これらのことが、マイコンに興味をもった原体験です。

MZ80のように、CRTとキーボード、そしてカセットテープ(記録装置)
が一体となったようなマイコンは憧れをもつには十分です。
それらのマイコンは当時の価格でも10万円は軽く超えるものでしたから、
お小遣いを貯めて買うようなレベルのものではありません。

ちなみに、MZ80やその後継機のMZ2000などを詳しく記述したHPがありました。
機能は低いが、夢が詰まっているという、記述に共感しました。

Nibbles lab: http://cwaweb.bai.ne.jp/~ohishi/index.htm  シャープ博物館


引用:MZ-80K

こういった記事を読んでいて、無性に一体型の(昔風の)パソコンを作ってみたくなりました。
私の原体験が疼きます(笑。

最後に作ったCPM80をベースに改造

最後に作ったCPM80は「高速」を意識して、基本的な機能を充実させました。
ただし、あくまでもCPU部分のみであり、WindowsのTeraTermというターミナルと接続して動かしています。
今回は、この基板をベースにモニターやキーボードも取り付けようと思います。


最後に作ったCPM80。Z8S18033(Z80相当,最大33MHz品)を60MHzオーバクロックで動作させ、
3MBのハードウエア転送のメモリーディススク内蔵。制御PIC(最大64MHz)も80MHzオーバクロック動作。




現状の構成です。CPU周辺しかありません。

キーボードについては、先日にUSB接続のメカニカルキーボードを改造して、UART(RS232)出力が可能にしました。
モニターについて、7インチのWVGA(800x480)の動作を確認しているので、それらを接続するようにする予定です。
モニターはZ80からもアクセスできるように(但し亀のように遅いだろうけど)、Z80のバスに接続します。
ただし、Z80だけからのコントロールでは、速度の問題がのこるので、アクセラレターとしてRP2040マイコンも
バスに接続して、画面表示の手伝いをさせるように考えます。


考えている構想です。WVGAはZ80のバスに接続しますが、アクセラレータとしてRP2040マイコンも接続します。

まずはバックプレーンを準備しよう!

基板が複数枚追加できるようにバックプレーンを作成です。
前につくった、バックプレーンを使います。ユニバーサル基板の裏側に配置したので、
穴ピッチの関係からコネクタは3個のみになります。まあ、3個あれば色々と遊べるでしょう。


CPM80と同じサイズの秋月のユニバーサル基板にカードエッジのコネクタを取り付けです。
穴ピッチの関係から3個だけです。


基板の裏面側にバックプレーン基板をとりつけています。



CPM80基板を下側にして、バックプレーン基板を追加です。


次は、RP2040アクセラレータとWVGA接続基板を作ろう!

Z80のI/Oに接続するだけなので、本来はそれほどややこしくないはずなのですが、
RO2040とWVGAが3.3Vロジックに対して、Z80が5Vロジックなので、どうしてもレベル変換を入れる必要があります。
そのため、すこし部品点数が多くなりそうです。

RP2040からもZ80のバスをアクセスするようにしているので、画面表示だけじゃなくてZ80のお手伝いもできるかもです。
浮動小数点の計算なんかを手伝わせられたら面白いかなあ〜。

回路図のPDFファイル。


夜な夜な作成です。


ポリウレタン被覆銅線をつかって配線しています。

とりあえず、配線は完了。あとで、配線チェックしなくっちゃ!

現実逃避? 2025.9.7

配線チェックって、もの凄く面倒な作業なので、おもわず現実逃避してしまいました。
まだ、動いてもいないのに、あたらしいI/O基板を作成です。
PSG(音源)ICのAY-3-8910Aを4個搭載した、基板を作成です。


音源用の基板です。PSGを4個搭載しています。


半田面です。配線はあまり多くはありません。


スピーカアンプはDAISOの300円スピーカについていた基板のICを活用です。
残しておいてよかったあ〜。


スピーカアンプとしてLTK8002を使いました。


psg_card.pdf へのリンク

まずは準備体操 2025.9.8

RP2040アクセラレター基板の配線チェックです。
すこし電源周りで抜けていたところがありましたが、確認完了です。

RP2040アクセラレータ基板の配線チェックが終わりました。

まあ、配線チェックが完了したからといって、動作するとは限りません。
回路自体が間違っている可能性もありすからね。

さて、この基板をCPM80に差し込んで動かそうとすると
RP2040基板のプログラム作成(VT100シミュレータ機能など)
CPM80のBIOS改造
PICの制御ソフト変更
などなど、多くの作業が必要です。
一気におこなうと、どこかでトラブルとどこが原因かわからなくなってしまうので、
地道に調査から始めます。まあ、準備体操みたいなものです。

VT100のコマンドは?

CPM80のターミナル機能をもたせるにはVT100をシミュレーションしなくてはなりません。
単に垂れ流しで表示するだけならまだしも、最低でもスクリーンエディタであるWORDMASTERを動かせる環境にはしたいものです。
となると、VT100のエスケープシーケンスを実装しなくてはいけません。

しかし、このエスケープシーケンスが、また無茶苦茶多いです。
ANSI/VT100 Terminal Control

こんなもの、まともに実装する気になりません。
そこで、現状のCPM80基板のシリアルポートの信号を横取りして、
WORDMASTERでどのようなエスケープシーケンスが使われているかを調べてみました。


シリアルポートの信号を横取りして、どのようなコードがでているかを調べてみました。

意外と少ない?

色々と動かしてみましたが、どうやら使っているエスケープシーケンスは3つ程度のようです。

ESC[n;mH  カーソル位置をn,mに移動する
ESC[2J     全画面クリアーしてカーソルはホーム位置へ
ESC[K     カーソルから行末までを削除

と、この程度です。これなら実装は簡単そうです。

WORDMASTERで使われているエスケープシーケンスの種類は少なそう。

あ、面倒だなあ〜。

カーソルの移動といえば、一言で済みますが、カーソルにある位置の文字を反転させるのが面倒です。
というのも、WVGAは書き込みONLYにしているので、書き込まれた内容を読み出すことはできません。
それができれば、カーソル位置の文字画像を読み出して、反転させたものを再度書き込めばいいだけですが、
それができません。
 キャラクターベース(80x24)のバッファーでよいので、何の文字を書き込んでいるかのイメージを持たせないと
いけない感じです。となると、スクロールなどしたときに、そちらも更新しなければなりません。
ああ、結構面倒だなあ〜。
 まあ、ぼちぼち進めましょう。

作ってみると、意外とあっさり 2025.9.9

プログラム作成が面倒そうだなあ〜と思っていましたが、
風呂に入りながら、プログラム構造について頭の中にめぐらせ、
なんとなくあっさり出来そうなので、一気に書いてみました。
エスケープシーケンスは必要最小限のみです。

で、正常に動いているかどうかを確かめながら、
具体的にはWORDMASTERでファイル編集をしたときに、
PC上のTeraTermの表示と、WVGAの表示が一致しているかを確認しながら、デバッグです。


こちらはWORDMASTERを動かした場合のPC上(VT100)の表示です。


こちらはWORDMASTERを動かした場合のWVGAの表示です。上と、一致しています。

うん!大丈夫そうだなあ〜。

キーボードの改造は終わっていることだから、それとまとめてVT100ターミナルを一つ作っておくのもいいかもです。
ちょっと長くなるかもしれないので、番外編にまとめましょう。

#しかし、ネットは便利です。PICOのUARTの受信割り込みって、どうやればいいか知らなかったのですが、
#ネットでくぐればでてきました。そっくり使わせてもらいました。
RaspberryPiPicoのUARTでエコーバック #RaspberryPiPico - Qiita
ソースサンプル

作業再開 2025.9.13

キーボードの準備もできたことだし、作業再開です。
まずは、本体用のWVGAモニターの固定台を作成です。
アクリルの端材を使ってCNCで切り出しです。
最近、ようやくアクリルの切削条件がわかりかけて来た気がします。
いままでは、よく切れるようにと4枚刃で高速回転としていましたが、
直ぐにアクリルが溶融して刃先にこびり付いて、切削不可にになります。
そのため、切削油なので冷却していましたが、まわりが油でべとべとです。
その代わり、切断面は綺麗です。
できるだけ刃先の温度を上げないようにと、低速で回すとアクリルのこびり付きも
ありません。そしてエンドミルも樹脂用のものを使用です。
切削面は4枚刃のものに比べると、すこし粗いですが接着するには支障のないレベルです。

さてさて、アクリル板の切り出しが終わりました。接着も完了です。
さっそく支持台にWVGAを取り付けです。
キーボードとの接続に既存のUSB-Cコネクタをつかいましたが、ちょっと出っ張るのがやはり
すこし気になりますが、まあ完成してから色々と調整していきましょう!

アクリルの切削に、シングルエッジエンドの工具を使います。
回転数は6000rpmくらいがいいようです。


WVGAパネルの支持台ができました。


パネルが取りつくと、こんな感じです。


なにも考えずに、USBコネクタ接続としたものだから、ちょっと出っ張ります。
モニタとキーボードをぴったりと引っ付けるのは現時点では難しそうです。

完成してから、修正していきましょう。

そろそろWVGA接続基板を動かしましょう?あれ?

WVGAの取り付けが終わったので、そろそろ、先につくったRP2040アクセラレータ&WVGA接続基板の
動作確認に移行しましょう。WVGAとの接続には40PINのケーブルが必要ですが、
普通のフラットケーブルでは硬いので、個別に製作です。
作るのは面倒そうに見えますが、何かの箱にグルグルと巻きつけたポリエステル被覆銅線を、
一か所でぶち切れば同じ長さの銅線が揃います。それの予備半田をしておけば、
割りとストレスなく作ることができます。


40Pinのストレート接続コネクタを作成です。

違うところでストレスがあ〜

いざ、接続しようとしてピンを確認したところ、なにか違和感を感じます。
あ、接続基板側のピン配置の偶数と奇数間違えているぞ!!!
あ〜、これを事前に知っていたら、接続ケーブルを作るときに入れ替えたのになあ〜。
なんか、違うとことでストレスがかかります(笑。


2つの基板をストレートケーブルで接続しようとしましたが、接続基板(下側)のピン配置を間違えていました。

まあ、こういったことも長い半田付け人生ではあるものでしょう〜。
ということで、偶数と奇数ピンの入れ替えアダプタを作成です。

ちょうど、基板間を結合するための小型のバックプレーンが作ってあったので、
これを切り出して、変換コネクタを作成です。

そして、ようやく接続基板とWVGAの接続ができました。


基板間の接続のために作ってあった小型のバックプレーンです。これが役に立ちました。


偶数と奇数ピンの入れ替え変換基板を作成です。


ようやく、接続基板とWVGAが接続できました。

動作確認開始

いままではRP2040のGPIOをWVGAに直結で動かしていましたが、今回はZ80のバス経由での動作になります。
そのため、レベル変換のゲートを2回通ることになり信号の遅延が懸念されます。
さらには、アドレスデコーダでのCS(Chip Select)信号なども新たに加わります。
まずは、Z80のバスとは切り離して状態での動作確認です。
 ただ、これで動いたとしても、Z80のバスにつなげると信号線の負荷が増えるので遅延が発生して、
動かなくなるかもしれまんが、そのときはその時で考えましょう。


RP2040とWVGAとはバス経由で信号を送るので、
信号遅延の影響が懸念材料です。


なお実際には、RP2040が勝手にバスを使うことはできないので、
コントロールセンターのPICからバス使用のリクエストを受けとってから
動くことになります..


RP2040からWVGAにアクセスするためには、PICからのバス利用の許可が必要ですので、
そのためのタイミングです。この部分は結構オーバヘッドがでそうですが、まあZ80が動くよりかは
随分速いでしょう..


まずは、バスを切り離しているので、基板内で常にバス利用可の状態をつくりだして、
WVGAの動作確認からです.。

おや?動いた?

ソフトを作成し、恐る恐る電源ONです。
WVGAに文字が表示されました。
あれ?動いた?
絶対に回路の1つや2つ、ソフトに3つや4つの間違いがあるかと思いましたが、
なぜか一発で動いてしまいました。
こりゃあ、順風満帆というか、あとあと怖いというか(罠が待っている?)。


まずは単体での動作が確認できました。

次は、Z80のバスに接続して動かしていきましょう。
その前に、ホスト(CPM80基板)もすこし手を加える必要があります。

思ったより変更必要だなあ〜 2025.9.14

新しく追加する基板もバスを占有することがあることから、
ホスト側すなわちCPM80基板の修正が必要です。
というのも、現状ではZ80からのBUSAKの信号でバスの占有が2区分に分かれていました。
なんせ、外からバス制御されるなんて想定していませんでしたから。
 BUSASK=L PICがバス使用
 BUSASK=H Z80がバス使用



これを、3区分になるように変更です。具体的には、こんな感じ。

BUSASKの信号
(HレベルでZ80がバス使用)
L H
C2信号
(LでPICがバス使用)
L PICがバスを
使っている状態
選択不可
(バスが衝突する)
H PIC,Z80もバスを
使っていない状態
※RP2040が使える状態
Z80がバスを
使っている状態

上記になるように改造を行います。気をつけないといけないのは、表のようにソフト側でBUSASK信号
(PICのC3)がHレベル、すなわちZ80がバスを使っているときにPICのC2(PICのバス使用)
をLにすると、バスの衝突が発生します。そのため、BUSREQを有効にしたのち、
BUSASKがLレベルになったのを検知してから、C2をHレベルに変更しなければいけません。
ちょっとややこしいです。

改造する箇所は下図の通り。ちなみに全体の元の回路は→FAST-Z80..pdf
これを下記の部分を変更です。


今回の改造箇所です。ORゲート(IC18-3)が余っていたので助かりました。
修正後の回路です。
z80_fast_mod.pdf

すこし残念なのは、従来はPICのA6,7を使って水晶発振で動かしています。
20MHzを4倍PLLの80MHzとして、オーバクロック状態です。
PICのピン数を追加で2個確保する必要があったため内部発振の64MHzに変更しました。
PICの処理速度が80%になってしまいます。SDカードの読み込み速度が遅くなるだろうなあ〜。

まずは、動作確認

PICおよびRP2040マイコン側のソフトを修正して、
CPM80の端末として動作できるようになりました。
これで、MZ80化計画はかなり前進です。


RP2040アクセラレータ&WVAG接続基板deCPM80が動き出しました。

頻繁に、バスの占有がPICやRP2040、Z80と入れ替わりますが、とくに問題はなさそうです。
ただ、現状では、ソフトの構造が歪なので、まだまだ修正が必要です。
まあ、のんびり進めましょう!

(つづく)