Pico2ROMEmuをCOSMACに応用してみました

COSMAC

@DragonBallEZが開発されたPico2ROMEmuを製作しSuper AKI-80に接続してROMエミュレーターとして使うことができました。高速処理をどうやって行っているのだろうとソースを拝見したところ、RP2350マイコンのPIOという機能を使い、複数のステートマシンで超シンプルなプログラムを動かして、高速な処理はそれに任せているという仕組みだとわかりました。これは面白いということで頭に浮かんだのがCOSMAC CPUに接続することです。早速ブレッドボードで実験回路を作成しました。

Pico2ROMEmuを使うメリット

Pico2ROMEmuは@DragonBallEZさんが開発されたもので、名前の通りRaspberry Pi Pico2を使って各種マイコンボードのROMの代わりにするものです。しかし、単なるROMエミュレーターではなくマイコンを動かすための便利な機能も実装されています。

  • 高速ROMのエミュレーション(ROMライターが不要)
  • Pico2のUSBを使用したUSBシリアル通信機能と5V電源の供給
  • マイコンに供給するCLOCKの生成
  • マイコンに供給するRESET信号の生成

これまでもCPUとPIC18F47Q43を接続し、PICに周辺デバイスの機能を持たせて動作させるEMUシリーズが電脳伝説さんにより開発されています。ただしPICですのでメモリ容量が少ないことや、PICに書き込むための専用プログラマやUSBシリアル変換ボードが別途必要になります。そこでPico2を使用することでこれらの課題がなくなるのではないかと考えました。Pico2のような高速・高性能のマイコンをわざわざCOSMAC CPUの周辺デバイスとするのはナンセンスという意見もあるでしょうが、本物のCPUを手軽に動かしたいだけです。

またCOSMACの場合、アドレスバスが8本しかなく上位アドレスと下位アドレスが時分割で送られてきます。このため64KBのメモリフル実装でも、Raspberry Pi Pico2のピンにでているGPIOの数で十分対応できてしまうのです。

Pico2とCOSMAC CPUの接続

早速Pico2ROMEmuを参考にして回路図を作成しました。データバスとアドレスバスがそれぞれ8本と制御信号が数本というシンプルな構成です。QとEF3はCOSMAC伝統のソフトウェアシリアルのTXとRXになります。これをPico2のUARTに割り当てたピンに接続しました。

これをブレッドボードに実装したものです。配線量は多いですが、Raspberry Pi Pico2とCOSMAC CPUだけのシンプルなものになります。

ROM機能の実装

Pico2ROMEmuの主機能であるROM機能をCOSMAC用に実装します。まずは8ビットのメモリ空間(0x00~0xFF)を実装しました。CPUクロックは2MHzを供給するように変更し、PIOのプログラムはCS,OEを見ているところを、MRD(Memory Read),TPB(Timing Pluse B)を見るように変更しただけです。

いつものLチカプログラムをROMデータに書き込みます。rom_basic_const.cを以下のように書き換えました。これが動くとQ出力のLEDが点滅を繰り返すはずです。

実行したところ問題なくLチカが動作することを確認しました。次にPIOのプログラムを書き換えてTPA(Timing Pluse A)のタイミングで上位バイトのアドレスも処理するようにして0x0100にLチカプログラムを配置して動かしてみました。

これも問題なく動作することを確認できました。

RAM機能の実装

次はMWR(Memory Write)信号を実装してRAMエリアに書き込む動作を試してみます。とりあえず0x1000~にRAMエリアを設定しました。PIOでどのようにRAM機能を実装するかいろいろ試しましたが、最終的にはメモリアドレス取得+メモリ読み出しのステートマシンと、メモリ書き込みのステートマシンの2つに分けて実装しました。

アドレス取得とメモリ読み出しのステートマシンはほぼROMの実装と同じですが、途中でMRDの信号をチェックしてメモリ読み出しのタイミングでなかったらそのあとのROMの処理をスキップしています。

メモリ書き込みのステートマシンはMWR信号がアクティブになるのをひたすら待ち、メモリ書き込みのタイミングになったらデータバスを読み込んでPico2のCPUに渡して、その内容でRAMエリアを書き換えます。メモリアドレスは先ほどのアドレス取得のステートマシンでグローバル変数に最新のものが保持されているのでそれを使います。

かなり甘い実装だと思いますが、COSMACはシンプルなのでこの実装で問題無く動作してくれました。動作テストは以下のようなシンプルなメモリアクセスのコードをrom_basic_const.cに組みこんで確認しました。

この状態でロジックアナライザでバスの信号を確認し、書き込んだデータの値と読みだしたデータが正しいことを確認できました。

IDIOTモニタを動かす

これで簡単なテストプログラムでの動作はある程度確認できましたので、いよいよモニタプログラムを動かしてみます。ここではEMU1802-miniの時に確認したIDIOTモニタを動作させました。

0x8000番地のRAMエリアへの読み書きも問題なく動作することを確認できました。

RCA BASIC3を動かす

次はRCA BASIC3を動かしてみます。これは1802メンバーシップカード用に提供されているBASICインタプリタです。これを組み込んで動作することも確認できました。

いつものASCIIART.BASも問題なく動作しました。

まとめ

せっかくここまで動作したので基板化してみます。以前製作したEMU1802-miniと同様にC基板サイズに納めたいと考えています。Pico2ROMEmuの機能とは異なりCOSMACに特化したものになってしまったのでこれまでforkしていたブランチからリポジトリを分離して、プロジェクトの名称をPico2MEMEmuCosmacとしました。今後の成果物はこのリポジトリにまとめますので、最新版のソースはこちらでご確認ください。

GitHub - kanpapa/Pico2MEMEmuCosmac: An Raspberry Pi Pico2 RP2350A-based ROM/RAM emulator(including clock, reset, and UART-USB) for CDP1802 COSMAC CPU
An Raspberry Pi Pico2 RP2350A-based ROM/RAM emulator(including clock, reset, and UART-USB) for CDP1802 COSMAC CPU - kanp...
タイトルとURLをコピーしました