ちょっと Tea Time!? PICO(RP2040)でSDカードを使えばCMP80はどこまで快適か? 2025.10.9

ことのはじまり
Z80をつかったCPM80マシンは幾つか製作したけれど、
快適につかうにはそのスピードは重要です。スピードとしてはCPUの速度もありますが、
それ以上に重要と感じているのがディスクの読み書きの速度です。
ディスクにはSDカードを使っています。もちろん、昔のフロッピーディスクに比べれば、
シーク(ヘッドを所定のトラックに機械的に動かすこと)もないので、格段に早いのですが、
データの読み出しをPICに任せているものだから、その部分でのアクセス速度がネックになります。
 そこで、その対策としてメモリーディスクなるものも作りました。3MBほどのSRAMを搭載したCPM80を作り、
さらのメモリーからのアクセスもI/Oアクセスではなく、DMA(Direct Memory Access)
とすることで、相当に早くすることができました。
 ただ、その場合のネックは部品数が増えてしまい、基板も大きくなってしまいます。
まあ、趣味なのでそんなものはあまり気にはなりませんが、もっと簡単な構成にならないかなあ〜
という気もしていました。

 当時は、SDカードを使うのにPICをつかっていましたが、最近ではRP2040(PICOなど)
をつかったマイコンを使うようになりました。PICではなく、それを使うとかなりメモリーディスクでなくても、
かなり高速化ができるのでは?と思うようになって、確かめたくなったのがことのはじまりです。

なんせ、PICの動作周波数は64MHzでその1/4のマシンサイクルのため、1命令は62.5nsですが、
RP2040の場合は125MHz動作で1命令8nsと7〜8倍は早くなる可能性があるからです。

モノは試しで作ってみましょう!

ということで、早速作ってみましょう。
まずは回路図を描き描きです。


Z80カードの回路図です。CPUとメモリー以外は、ほぼなにもありません。
z80_cpu.pdf


Z80カードを制御するRP2040のコントローラ基板です。Z80とRP2040のロジックレベルがそれぞれ5Vと3.3Vと異なることもあり、
電圧変換のためのバッファーが結構必要になっています。

z80_backplane.pdf

組み立てましょう!

Z80カードは割と簡単ですが、制御基板は結構配線も多いので、夜の夜長のお遊びに最適です。
泡のでる麦茶を片手に、夜な夜な半田付けです。


こちらはZ80の制御基板です。


配線は結構いっぱりあります。



途中、ソフトのデバッグ等に使えるだろうと思い、OLEDも取り付けました。


こちらはZ80基板です。かなりの空きスペースがあります。なんせCPUとメモリーだけのような構成です。


Z80基板は素子も少ないので、配線もさほど多くはありません。

動かしてみましょう!

作成した基板をバックプレーンに差し込んで、動かしていきます。
ソフトはPIC用に作ったものを、ほぼそのままコピーです。
 まあ、Z80のシステムクロックが変更できるように、Si5351モジュールなども搭載しているので、
若干は変更を加えていますが、大方同じです。
 ちなみに、このバックプレーンへの電源供給ですが、手元のSW電源をつかいました。
±15Vと5Vが同時にだせる便利なものですが、5V出力を0.5A以上流さないと動作が安定しない
という制約があるので、5Vラインの電流を無駄に流すための抵抗基板も差し込んでいます。

 あとSDカードにはALIで安価に購入した512MBです。たぶん、この容量だと他には使い道は
ないだろうなあ〜。

作成した基板はバックプレーンに差し込んで、動かしていきます。紫色のモジュールはSi5351の
クロックジェネレータでZ80のシステムクロックを生成していますす。これで任意の周波数で
Z80を動かすことができます。

 
電源につかったSW電源。5Vと±15Vが出せるので便利ではあるのですが、
5Vは0.5A以上流さないと、動作が安定しない制約があります。



5Vラインに無駄に電流を流すための、抵抗付基板です。


SDカードはALIで100円ほどで買った512MBです。
中身は最大で16MB(2MBドライブx8)しかつかっていません。


Z80はオーバクロックで!
 CPM80が動くことが確認できたので、せっかくSi5351モジュールも搭載しているので、
オーバークロックに挑戦です。搭載しているZ80が20MHzのものなので、20MHzから
徐々に上げていきましした。
 20MHz−−−もちろん大丈夫
 22MHz−−−まだ大丈夫!
 24MHz−−−まだ大丈夫!
 26MHz−−−を!結構早いやん(30%UP)
 28MHz−−−あ、動かない

ということで、26MHzまでは動作することが確認できましたが、余裕をみて24MHzで動作させることにしました。
それでも、20MHzに比べれば20%の増速が計れました。

さて、実行速度を比較評価しましょう!

実行速度を比較評価するために、他の2台ほどのCPM80が動く基板を準備です。
今回製作したものが対象その1なので、その2とその3を用意です。

測定対象その2:秋月のSuperAKI80をつかったCPM80基板です。
Z80は12MHzで動いています。PIC(64MHz)でSDカードをアクセスしています。


測定対象その3:今まで作成した一番高速のCPM80基板です。写真は改造前のもので、
今はZ80ではなくZ8S18033をつかっています。これはMZ80化計画で使用中です。
Z80の動作クロックは44MHz(以前は60MHzにしていたが、MZ80化計画で基板を追加したら、
動作が不安定になったので44MHzに落としました)。
ディスクはPIC制御(64MHz)でのSDカードと、DMA転送のメモリーディスクの両方があります。

比べてみましょう!

比較評価として、下記で掲載されていた短いプログラムですが、これをHI-TECH Cで
コンパイル&リンクした場合の実行時間を計測です。
HI-TECH Cを使ってみた #CP/M - Qiita

浮動小数点のライブラりーの結合もあるので、ちょっとした処理時間は必要になるはずです。


短いプログラムですが、これをのコンパイル&リンクの時間で評価です。



こんなアスキーアートを書くことができます。

測定時間の結果は以下の通り。計測はスマホのストップウオッチをつかったので、
押す時間のバラつきから0.1〜0.2秒程度は誤差があるでしょうが、まあ関係ないでしょう。

対象 Z80クロック ディスク コンパイル&リンク時間
(s)
1(今回製作) 24MHz SDカード
(RP2040-125MHz)
8.47
2(SuperAKI80) 12MHz SDカード
(PIC-64MHz)
24.85
3(高速CPM80) 44MHz SDカード
(PIC-64MHz)
15.83
3(高速CPM80) 44MHz RAMディスク
(DMA転送)
3.6

やっぱりメモリーディスクは早いなあ〜。
上記表の結果から、CPUの処理時間とディスクのアクセス時間を分離を行います。
次式のような近似式を得ました。

コンパイル&リンク時間 = (A / Z80クロック) + B
ここで
A:1MHzあたりのCPU処理時間(s) A=149
B:デイスクのアクセス時間(s)


で、肝心のB(ディスクのアクセス時間)ですが下表の通りになりました。

SDカードのアクセスをPICからRP2040に変更することで、5.5倍の速度向上となりました。
ただ、それでもメモリーディスクの10程度は時間が必要になるようです。

B(ディスクのアクセス時間)
(s)
相対速度比
SDカード(PIC-64MHz) 12.44 1
SDカード(RP2040-125MHz) 2.26 5.5
メモリーディスク(DMA転送) 0.21 59

高速なRP2040をしてもっても、メモリーディスクの足元にもおよばなそうです。
まあ、メモリーディスクがはやすぎるのかなあ〜。ただ、PICをつかった時より5.5倍は
向上しているのて、ソフトの見直し等で10倍くらいは早くなりそうな気もしてきました。

まとめ
 SDカードのアクセスをPICからRP2040に変更することで約5.5倍アクセス速度が向上しました。
ただし、メモリーディスクに比べると、まだ1/10の処理速度なので、まだまだ課題はありそうです。

(おしまい)