ちょっと 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の処理速度なので、まだまだ課題はありそうです。
(おしまい)