picoZ80
概要
picoZ80 は tranZPUter のコンセプトを継承し、ホストコンピュータや産業用コンピュータの物理的な Z80 を、より高速な CPU・大容量メモリ・仮想デバイス・ネットワーク機能(WiFi・BT)・SD カードや WiFi からの高速アプリケーションロードへと置き換えるものです。
これはカスタム PCB であり、あらゆるレガシー Z80 ベースコンピュータの Z80 DIP-40 CPU ソケットに直接差し込める設計です。個別の Z80 プロセッサーを使用する代わりに、最大 300MHz で動作可能なデュアルコア 150MHz の Cortex-M33 デバイスである RP2350B マイクロコントローラーを搭載し、そのプログラマブル I/O(PIO)ステートマシンが Z80 のアドレスバス・データバス・制御バスをサイクル精度で完全に制御します。
picoZ80 は単純なエミュレーターアダプターではありません。すべてのバストランザクションは RP2350 の PIO エンジンによってリアルタイムで処理され、ホストシステムには実際の Z80 と同一のバスタイミングが提供されます。同時に、RP2350 の第 2 コアと豊富なオンチップ SRAM、8MB の外部 PSRAM、16MB の Flash により、加速実行・仮想化メモリ・ROM バンキング・仮想ディスクドライブ・完全なマシン・ペルソナエミュレーションなど、ほぼ無限の機能を Z80 インターフェースの上に重ねることができます。
ESP32 コプロセッサーが WiFi・Bluetooth 接続・SD カードマスストレージ・ブラウザーベースの管理インターフェースを提供します。すべての設定は SD カード上に保存された単一の人間が読みやすい
config.json ファイルによって管理されるため、ボードのメモリマップ・ROM イメージ・ドライバーの選択を変更するために再コンパイルは不要です。
picoZ80 は複数の Sharp MZ マシン上での動作が実証されています。これらのマシン向け(将来的には他の Z80 システム向けも)にペルソナが開発されており、バンク切り替え RAM/ROM・フロッピーディスクエミュレーション・QuickDisk エミュレーション・ROM ファイリングシステム・TranZPUter ファイリングシステムなど、必要な機能を同時に使用可能な形で提供します。設定は完全に JSON ベースであり、新しい Z80 ベースのホストへのサポート追加は設定ファイルの編集で行い、新しい I/O 動作が必要な場合は小さな C ドライバーをコードベースに追加するだけです。
- Z80 ドロップイン交換
- 任意の Z80 DIP-40 ソケットに装着できます。ホストは常に正常な Z80 バスタイミングを認識します。 - サイクル精度 PIO バスインターフェース
- 3 つの RP2350 PIO ステートマシンがアドレス・データ・制御信号を Z80 バス速度でフルに同時処理します。 - 大容量メモリ空間
- 8MB PSRAM を 64 バンク × 64KB として構成し、CPU コンテキストごとに合計 4MB のバンク切り替えアドレス空間を提供します。 - ROM/RAM バンキング
- メモリブロックは 512 バイト単位で設定可能で、ROM・RAM・物理ホストメモリ・仮想関数ハンドラーとしてマッピングできます。 - 仮想デバイスフレームワーク
- 任意の 512 バイトのメモリブロックや I/O ポート範囲を C 関数でバックアップでき、完全に仮想化されたペリフェラルを実現します。 - マシン・ペルソナ
- Z80 ファームウェアは JSON 設定ファイルを通じて任意の Z80 ホスト上で動作するよう設定できます。RP2350/ESP32 のリソースを活用して仮想ドライバーをホストに追加するペルソナが開発されています。MZ-700 ペルソナはすでに豊富なドライバーを搭載しており、MZ-80A・MZ-80B・MZ-800 およびその他の Sharp マシン、さらに Amstrad PCW などへも拡張される予定です。 - フロッピーおよび QuickDisk エミュレーション
- WD1773 互換フロッピーディスクコントローラーと Sharp QuickDisk ドライブエミュレーション。SD カード上の DSK/RAW/D88 イメージを使用します。 - WiFi および Web 管理
- オンボード ESP32 が 7 ページ構成の Bootstrap Web インターフェースを提供し、設定・ファイル管理・OTA ファームウェアアップデート・ペルソナ選択が行えます。 - ICE デバッグシェル
- USB CDC シリアル経由でアクセス可能な 39 コマンドの ICE デバッガー。ブレークポイント(最大 8 個同時)、シングルステップ実行、実行トレース、Z80 レジスター検査、メモリおよび I/O の読み書き、内蔵 Z80 ディスアセンブラーおよびアセンブラー、システムステータス監視を提供します。 - デュアルファームウェアパーティション
- 2 つの独立した 5MB ファームウェアスロットにより安全な OTA アップグレードが可能。アクティブパーティションは Web インターフェースまたはブートローダーから選択します。 - USB ファームウェアアップデート
- ブートローダーがハードウェアデバッガー不要でファームウェアを書き込める USB ブリッジを公開します。
ハードウェア
picoZ80 PCB(リビジョン 2.5)は、Z80 DIP-40 パッケージの物理的なフットプリントに収まるよう設計されたコンパクトな多層基板で、典型的なレトロコンピューターケース内のクリアランスにも対応しています。すべてのロジックは 3.3V で動作し、5V ホストバスに対するレベルシフトと駆動電流の考慮は回路図設計で対応しています。
基板は 1 枚の PCB 上に 5 つのサブシステムを統合しています。RP2350B プロセッサー・Z80 バスインターフェース・ESP32 コプロセッサー・電源回路・USB ハブです。
主要コンポーネント
- RP2350B(Cortex-M33 デュアルコア)
- メインプロセッサー。最大 300MHz で動作し、Z80 エミュレーションのホットループをコア 1 で実行し、ファイル I/O・USB・ESP32 リレーをコア 0 で処理します。512KB のオンチップ SRAM を搭載。RP2350A ではなく RP2350B バリアントを使用する理由は、Z80 バスフル対応に必要な 48 本の GPIO ピンを備えているためです。 - 16MB SPI Flash
- ブートローダー・2 つのアプリケーションファームウェアスロット・2 つの設定スロット・汎用設定パーティションを格納します。総アドレス空間は 0x10000000〜0x11000000 です。 - 8MB PSRAM(SPI)
- エミュレートされた CPU 向けに 64 バンク × 64KB のバンク切り替えアドレス空間を提供する外部擬似スタティック RAM。専用 SPI ペリフェラルを通じて RP2350 に接続されます。 - ESP32 コプロセッサー
- WiFi(802.11 b/g/n、AP モードおよびクライアントモード)・Bluetooth・SD カードリーダー・Web サーバーを提供します。RP2350 とは 50MHz FSPI および 460.8kbaud UART で通信します。 - SD カードスロット
- FAT32 形式で ESP32 が管理します。config.json・ROM イメージ・ディスクイメージ(DSK・QuickDisk・RAM ディスク)・TZFS/RFS ファイリングシステムツリーを格納します。 - USB ハブ
- ホスト接続とファームウェアアップデートブリッジ用のオンボード USB ハブ。 - 3.3V 電源
- Z80 ソケットの VCC ピンから供給される 5V を変換する効率的なバックコンバーター。
picoZ80 のハードウェアは KiCad で設計されています。現在のリビジョンは v2.5 です。回路図と PCB レイアウトファイルはプロジェクトリポジトリの
シート 1 — RP2350B プロセッサー
kicad/PICOZ80/ 以下にあります。
回路図は 5 枚のシートに分割されています。
すべての RP2350B GPIO 割り当て・デカップリング・12MHz 水晶発振器・16MB Flash・8MB PSRAM の接続を示します。RP2350B QFN-80 パッケージを選択した理由はその 48 本の GPIO 数にあります。Z80 バス全体(16 本アドレス + 8 本データ + 12 本制御信号)に加え、ESP32 SPI/UART および USB 信号が利用可能なほぼすべてのピンを使用します。

ESP32-S3-PICO-1 モジュール・SD カードインターフェース(SPI)・チップアンテナ・デバッグヘッダー・プロセッサー間通信ライン(50MHz FSPI バスおよび 460.8kbaud UART)を示します。SD カード信号とプロセッサー間 SPI/UART はこのシートで明確に分離されています。

40 ピン DIP ソケット接続とバスインターフェースの抵抗ネットワークを示します。アドレスライン A0〜A15・データライン D0〜D7・すべての Z80 制御信号(MREQ・IORQ・RD・WR・M1・RFSH・BUSREQ・BUSACK・HALT・INT・NMI・WAIT・CLK・RESET)は、PIO ステートマシンが監視する専用の RP2350 GPIO ピンへシリーズ抵抗を通じて接続されます。

入出力フィルターコンデンサーを備えた TLV62590BV 5V→3.3V 同期バックコンバーターを示します。このコンバーターは Z80 DIP-40 ソケットの単一 5V VCC ピンから、最大 300MHz で動作する RP2350B・8MB PSRAM・ESP32・USB ハブの合計負荷を賄う必要があります。

Mini-B コネクター・12MHz 水晶・RP2350(ファームウェアアップデートブリッジ用)および ESP32(新しいボードリビジョンでは直接 USB アクセス用)へルーティングされたダウンストリームポートを備えた CH334F USB ハブコントローラーを示します。

PCB は必要な回路をすべて収め、DIP-40 ソケットの制限内に収まるよう可能な限り小型に設計されました。
手実装可能な最小のコンポーネントが使用されています。具体的には 0402/0603 のパッシブ部品と 0.5mm ピッチの IC を使用して全体サイズを縮小し、必要なすべてのコンポーネントを収めるために 6 層スタックアップが選択されました。
初期設計の v2.0 と v2.1 は、はんだの点付け・手動部品配置・ホットエアリワークステーションで手実装されました。バージョン 2.2 はステンシルとリフローオーブンで手実装されました。v2.3a と v2.5 は PCB ファブリケーター工場で実装されました。
PCB 概要
インタラクティブな PCB コンポーネント配置図と部品表(BOM)はこちらをクリックしてご覧ください。
アーキテクチャ
デュアルコア設計
RP2350B の 2 つの Cortex-M33 コアはそれぞれ完全に独立した役割を担い、コア間メッセージキュー(
PIO バスインターフェース
queue_t)を通じて通信します。
コア 0 はすべての非リアルタイムタスクを担当します。USB ブリッジと CDC シリアル・ファームウェアアップデートの調整・UART 経由で ESP32 にリレーするファイル I/O・ESP32 コマンドディスパッチ(フロッピー/QuickDisk イメージの変更・設定リロード・バージョン照会)・パーティション管理です。
コア 1 は CPU エミュレーションのホットループを専属で実行します。PIO FIFO をサービスして Z80 バストランザクションを処理し、各アドレスをメモリマップと照合して、物理ホストハードウェアへのトランザクション転送(PHYSICAL タイプ)・PSRAM からのサービス(RAM/ROM タイプ)・仮想デバイスハンドラー関数の呼び出し(FUNC タイプ)のいずれかを行います。内部ループを SRAM 上に保持し、512KB の RP2350 SRAM をメモリブロックポインターの高速ルックアップテーブルとして使用することで、このパスのレイテンシーを最小化しています。
Z80 バスインターフェースは RP2350 PIO アセンブリ(
z80.pio)で完全に実装されています。RP2350 は 3 つの PIO ブロック(PIO 0・PIO 1・PIO 2)を持ち、それぞれ 4 つのステートマシンを備えています。Z80 ファームウェアはすべての 3 つの PIO ブロックを使用します。
- PIO 0 — アドレスおよびデータバス(GPIO 0〜23)
- 16 ビットアドレスバス(A0〜A15、GPIO 0〜15)と双方向 8 ビットデータバス(D0〜D7、GPIO 16〜23)を処理します。ステートマシンはz80_addrとz80_dataプログラムを同時実行し、アドレスワードを送り出してデータバイトを同期して駆動またはサンプリングします。 - PIO 1 — 制御信号・サイクル実行・DRAM リフレッシュ(GPIO 16〜47)
- 上位 GPIO 範囲に対してメインバス制御プログラムを実行します。サイクルステートマシン(z80_cycle)が DRAM リフレッシュ生成を含むすべての Z80 バスサイクルを統合的に調整します。バスリクエスト/アクノレッジ(z80_busrq)・NMI 検出(z80_nmi)・クロック同期(z80_clk_sync)・割り込みアクノレッジ処理(z80_int_ack)です。 - PIO 2 — ホストタイミング・リセット・ウェイトステート
- コア 1 が内部メモリをサービス中でも正確に保たなければならない RP2350 とホスト Z80 バス間のタイムクリティカルなインタラクションを管理します。PIO 2 では 4 つの専用ステートマシンが動作します。- RESET 検出(
z80_reset)— ホストの RESET ラインを監視し、コア 1 に通知することで、ハードウェアリセットのたびにエミュレーション状態をクリーンに再初期化します。 - ウェイトステートジェネレーター(
z80_wait)— ホストバスで /WAIT をアサートすることにより設定可能な T サイクルウェイトステート(tcycwaitJSON パラメーターで制御)を挿入し、低速ペリフェラルやバンク切り替え ROM/RAM のタイミング要件に合わせて個々のバスサイクルを延長します。 - T1 同期(
z80_sync)— 各バスサイクルの T1 の立ち上がりエッジ(Z80 がバスに有効なアドレスを置く時点)を検出し、IRQ でコア 1 に通知します。この同期はホストクロックの精密なタイミングに依存するアプリケーション(ソフトウェア遅延ループや、カセットモーター制御・シリアルビットバンギングなどのタイムクリティカル I/O を含む)に必須であり、RP2350 の内部メモリ操作がホストから知覚可能なタイミングドリフトを引き起こさないようにします。
- RESET 検出(
z80.pio 内のすべての PIO プログラムを PIO ブロック別にまとめると次のとおりです。
| PIO | プログラム | 機能 |
|---|---|---|
| 0 | z80_addr |
16 ビットアドレス(A0〜A15)をバスに出力し、サイクル開始を通知する。 |
| 0 | z80_data |
D0〜D7 を駆動またはサンプリングし、BUSRQ 中のトライステート制御を行う。 |
| 0 | z80_cycle |
トップレベルバスサイクルシーケンサー — フェッチ・リード・ライト・I/O・DRAM リフレッシュサイクルを調整する。 |
| 0 | z80_fetch |
オペコードフェッチバスサイクル(M1 + MREQ + RD)。 |
| 1 | z80_mem_read |
メモリリードバスサイクル(MREQ + RD)。 |
| 1 | z80_mem_write |
メモリライトバスサイクル(MREQ + WR)。 |
| 1 | z80_io_read |
I/O リードバスサイクル(IORQ + RD)。 |
| 1 | z80_io_write |
I/O ライトバスサイクル(IORQ + WR)。 |
| 1 | z80_busrq |
BUSREQ/BUSACK を管理し、/IORQ・/MREQ・/RFSH・/M1・/HALT・/WR・/RD を解放する。 |
| 1 | z80_nmi |
NMI アサートを検出してコア 1 に通知する。 |
| 1 | z80_clk_sync |
PIO ステートマシンを Z80 CLK 信号に同期させる。 |
| 1 | z80_int_ack |
割り込みアクノレッジサイクル(M1 + IORQ)を処理する。 |
| 2 | z80_reset |
ホスト RESET ラインを監視し、コア 1 にエミュレーション状態の再初期化を通知する。 |
| 2 | z80_wait |
ホストバスに設定可能な T サイクルウェイトステートを挿入する(tcycwait で制御)。 |
| 2 | z80_sync |
各バスサイクルの T1 を検出して IRQ でコア 1 に通知し、内部メモリ操作をホストクロックに同期させる。 |
ステートマシンはポーリングではなく PIO IRQ フラグで通信するため、マシン間のレイテンシーを排除しています。IRQ 0 はアドレス/サイクル開始を、IRQ 1 はデータフェーズを、IRQ 2 は T1 検出を、IRQ 3 は RESET イベントを、IRQ 4 は NMI を、IRQ 6 はアクティブな BUSRQ をそれぞれ通知します。
PIO プログラムは Cortex-M33 コアとは独立して実行されるため、コア 1 が PSRAM アクセスや仮想デバイス呼び出しで占有されているときでも、バスインターフェースは決定論的に応答し続けます。
3 層メモリモデル
メモリアクセスはレイテンシーが増加する 3 段階を通じて解決されます。
第 1 層 — RP2350 SRAM(512KB、ウェイトステートなし)
Z80 の 64KB アドレス空間の 512 バイトブロック 1 つにつき 1 エントリーの、32 ビット
PSRAM は 64KB の RAM または ROM イメージを 64 バンク分保持するほか、64KB の
ファームウェア・ROM イメージ・最小化された
Z80 の 64KB アドレス空間の 512 バイトブロック 1 つにつき 1 エントリーの、32 ビット
membankPtr 値 128 エントリー配列を持ち、コア 1 はすべてのバストランザクションに対してブロックタイプを O(1) でルックアップできます。この配列は内部ディスパッチテーブルであり、各エントリーはブロックタイプをエンコードし、PSRAM バックのブロックには PSRAM オフセットも含みます。
第 2 層 — 外部 PSRAM(8MB、SPI)PSRAM は 64KB の RAM または ROM イメージを 64 バンク分保持するほか、64KB の
memPtr ポインター配列・64KB の memioPtr 関数ポインター配列・64KB の ioPtr I/O 関数ポインター配列を格納します。PSRAM アクセスレイテンシーは決定論的で、DMA を伴う RP2350 の SPI ペリフェラルで処理されます。
第 3 層 — 16MB SPI Flashファームウェア・ROM イメージ・最小化された
config.json は Flash に格納されます。ROM イメージはブート時に Flash から PSRAM にコピーされ、以降はランタイムに PSRAM からサービスされます。通常の Z80 バストランザクション中に Flash はアクセスされません。
メモリブロックは 512 バイト単位で設定されます。使用可能なブロックタイプは次のとおりです。
| タイプ | 説明 |
|---|---|
PHYSICAL |
実際のホストハードウェアへのパススルー — RP2350 がバスを解放し、物理ホストメモリが応答します。 |
PHYSICAL_VRAM |
PHYSICAL と同様ですが、ホストビデオ RAM タイミング用の追加ウェイトステートがあります。 |
PHYSICAL_HW |
ホストハードウェアレジスターへのパススルー。 |
RAM |
読み書き可能 — PSRAM バンクでバックアップ。 |
ROM |
読み取り専用 — PSRAM バンクでバックアップ。ライトサイクルは無視されます。 |
VRAM |
PSRAM バックのビデオ RAM。ライトサイクルは物理ホスト VRAM にもミラーされます。 |
FUNC |
仮想デバイス — アクセスごとに C 関数呼び出しがトリガーされ、任意の I/O エミュレーションが可能です。 |
PTR |
バイト単位リダイレクト — 512 バイトブロックの各バイトが他の任意のブロックまたはタイプを指すことができます。 |
16MB Flash は次のように分割されています。
| パーティション | アドレス範囲 | サイズ | 内容 |
|---|---|---|---|
| ブートローダー | 0x10000000–0x1001FFFF |
128KB | USB ブリッジ・ファームウェアアップデート・パーティションセレクター |
| App スロット 1 | 0x10020000–0x1051FFFF |
5MB | メイン Z80 ファームウェア(パーティション 1) |
| App スロット 2 | 0x10520000–0x10A1FFFF |
5MB | メイン Z80 ファームウェア(パーティション 2) |
| App 設定 1 | 0x10A20000–0x10C9FFFF |
2.5MB | ROM イメージ + 最小化設定 JSON(スロット 1) |
| App 設定 2 | 0x10CA0000–0x10F1FFFF |
2.5MB | ROM イメージ + 最小化設定 JSON(スロット 2) |
| 汎用設定 | 0x10F20000–0x10FFEFFF |
892KB | コア設定・スクラッチスペース |
| パーティションテーブル | 0x10FFF000–0x11000000 |
4KB | アクティブスロット・チェックサム・メタデータ |
各設定スロットは最大 64 個の ROM イメージと 64KB の最小化 JSON 設定を格納できます。アクティブスロットはパーティションテーブルに記録され、Web インターフェースから、またはブート時に適切なボタンを押し続けることで切り替えられます。
マシン・ペルソナ
アクティブなペルソナは Web インターフェースのパーソナリティページで選択するか、
ペリフェラルおよびファイリングシステムドライバー
config.json を編集して設定します。
ファームウェアを
INCLUDE_SHARP_DRIVERS でビルドすると、以下のペリフェラルドライバーがコンパイルされ、JSON 設定を通じて任意の仮想ハードウェアペルソナにバインドできます。
- MZ700.c — Sharp MZ-700 ペリフェラルセット
- MZ-700 固有のバンク切り替え・ビデオ・キーボード I/O をペリフェラルレベルで処理します。 - MZ80A.c — Sharp MZ-80A ペリフェラルセット
- SA-1510 モニター ROM、2KB VRAM、Intel 8253 PIT(6 つのカウンターモードすべてに対応するプログラマブルインターバルタイマー)、Intel 8255 PPI(プログラマブルペリフェラルインターフェース)、LS367 キーボードスキャナー、および CP/M サポート用 MEMSW/MEMSWR メモリスワップ機構(0x0000 のモニター ROM と 0xC000 の RAM を入れ替え)を含む完全な MZ-80A マシンエミュレーション。物理(実ハードウェア)および仮想(PSRAM ベース)の両方の動作をサポートし、ドライバーは仮想的に動作しつつ物理フロッピーコントローラーを使用する混合モードにも対応します。サブインターフェース:RFS・MZ80AFI・MZ-1E14・MZ-1E19・MZ-1R12・MZ-1R18。 - MZ2000.c — Sharp MZ-2000 ペリフェラルセット
- 物理モード(実 MZ-2000 ハードウェアでのドロップイン Z80 置換、ブート/通常モード自動検出)と仮想モード(PSRAM ベースの完全エミュレーション、IPL ROM ミラーリング)の両方をサポート。ブート/通常メモリモード切替(BST/NST)、キャラクターおよびグラフィックス VRAM オーバーレイ(バンク選択付き)、Intel 8253 PIT(4 MHz)、Intel 8255 PPI(カセット・メモリモード制御)、Z80 PIO(キーボード・VRAM ページング)、MB8866 FDC 対応。サブインターフェース:RFS、MZ80AFI、MZ-1E14、MZ-1E19、MZ-1R12、MZ-1R18。 - WD1773.c — フロッピーディスクコントローラー
- WD1773 FDC をエミュレートし、SD カード上の DSK、RAW、D88 形式の 80 トラック・2 ヘッド・8 セクター/トラックのディスクイメージをサポートします。WD1773 レジスターは FUNC タイプの I/O ブロックとしてマッピングされます。 - QDDrive.c — QuickDisk ドライブ
- SD カード上の QD イメージファイルを使用して Sharp QuickDisk シーケンシャルアクセスミニチュアドライブをエミュレートします。 - RFS.c — ROM ファイリングシステム
- RFS バンキングとファイリングインターフェースを実装し、SD カードから MZF プログラムファイルをロードできます。RFS ペルソナには CP/M v2.23(48K)・カスタム SA-1510 BASIC インタープリター・Microsoft BASIC v4.7 が含まれており、すべて SD カードへの読み書きアクセスが拡張されているため、カセットやフロッピーハードウェアなしでプログラムとデータを SD カードに直接ロードおよびセーブできます。 - TZFS.c — TranZPUter ファイリングシステム (開発中)
- TZFS 統合フレームワークは整備済みですが、仮想 I/O プロセッサーの追加ロジックは開発中です。マシンエミュレーション切り替え・ファイル管理・CP/M ブート・I/O 読み書きコマンドはこの作業が完了次第使用可能になります。 - MZ-1E05.c — フロッピーディスクインターフェースユニット
- WD1773 FDC をベースとした Sharp MZ-1E05 フロッピーディスクコントローラーユニットをエミュレートします。 - MZ8BFI.c — MZ-8BFI / E0054PA フロッピーディスクインターフェース(MZ-2000)
- MZ-2000 の MB8866/WD1773 互換 FDC をエミュレート。オンボードドライバー ROM なし(FDC コードは MZ-2000 IPL ROM 内)。D88 ディスクイメージフォーマット対応。40 シリンダー、2 ヘッド、16 セクター/トラック、256 バイト/セクター。 - MZ-1E14.c — BIOS ROM 付き QuickDisk コントローラー(MZ-700 / MZ-800)
- MZ-700 および MZ-800 マシン用のオンボード BIOS ROM を含む MZ-1E14 QuickDisk コントローラーをエミュレートします。 - MZ-1E19.c — BIOS ROM なし QuickDisk コントローラー(MZ-800 / MZ-2000 / MZ-2200 / MZ-2500)
- オンボード BIOS ROM を持たず MZ-800・MZ-2000・MZ-2200・MZ-2500 マシンを対象とした MZ-1E19 QuickDisk コントローラーをエミュレートします。 - MZ-1R12.c — 32KB バッテリーバックアップ RAM ボード
- Sharp MZ-1R12 32KB バッテリーバックアップ RAM 拡張をエミュレートします。実際のバッテリーを使用する代わりに、RAM イメージを SD カードに保存・復元します。このボードはアプリケーションを格納してブート時にすぐ利用できるようにするために一般的に使用され、長いカセットロード時間を回避できます。 - MZ-1R18.c — 64KB RAM ボード
- Sharp MZ-1R18 64KB RAM 拡張をエミュレートします。通常、プログラムストレージ用の RAMFILE ディスクとして、または標準アドレス空間以上のメモリを必要とするカスタムアプリケーション向けの追加メモリとして使用されます。
ビルド手順
前提条件- CMake 3.20 以上
- RP2350 ファームウェアのビルドシステムとして使用します。 - ARM GCC ツールチェーン
-arm-none-eabi-gcc。通常はapt install gcc-arm-none-eabiでインストールします。 - Docker
- ESP32 ファームウェアのビルドに必要です。公式 Espressif IDF コンテナー(espressif/idf:release-v5.4)内で実行されます。ネイティブの ESP-IDF インストールは不要です。 - Python 3
- Pico SDK ビルドツールで必要です。 - Perl
- ビルドスクリプトで自動バージョン増分に使用します。
すべてのパスはユーザーが選択したルートディレクトリ(ここでは
<root> と呼びます)からの相対パスです。ビルドスクリプトの先頭にある PICO_PATH 変数は最初の使用前にこのルートに合わせて更新する必要があります。セットアップ後に期待されるレイアウトは次のとおりです。
<root>/
├── get_and_build_sdk.sh # pico-sdk と pico-examples をクローンしてビルドする
├── build_tzpuPico.sh # RP2350 ファームウェア(オプションで ESP32 も)をビルドする
├── picoZ80.h.tmpl # ビルド時に SDK にコピーされるボード定義テンプレート
├── pico-sdk/ # get_and_build_sdk.sh によってクローンされる
├── pico-examples/ # get_and_build_sdk.sh によってクローンされる
└── projects/
├── Z80/ # Zeta Z80 エミュレーターライブラリ(手動でクローン)
└── tzpuPico/ # メインの picoZ80/pico6502 プロジェクト(手動でクローン)
mkdir -p <root>/projects
cd <root>/projects
<a name="clone-the-main-tzpupico-project" id="clone-the-main-tzpupico-project"></a>
# メインの tzpuPico プロジェクトをクローン
git clone <tzpuPico-repo-url> tzpuPico
<a name="clone-the-zeta-z80-emulator-library" id="clone-the-zeta-z80-emulator-library"></a>
# Zeta Z80 エミュレーターライブラリをクローン
git clone <zeta-repo-url> Z80
get_and_build_sdk.sh と build_tzpuPico.sh の両方の先頭にある PICO_PATH 変数を選択したルートディレクトリに向けるよう編集します。
export PICO_PATH=/your/chosen/root/
get_and_build_sdk.sh は Raspberry Pi Pico SDK(develop ブランチ)と pico-examples(master ブランチ)をルートにクローンし、すべてのサブモジュールを初期化してから RP2350 ターゲット向けに SDK をビルドします。最初のファームウェアビルドの前に一度実行し、SDK を更新する際にも再実行します。
cd <root>
./get_and_build_sdk.sh
スクリプトは
<root>/pico-sdk/ と <root>/pico-examples/ にクローンし、次のコマンドで SDK をビルドします。
cmake -DPICO_BOARD=pimoroni_pga2350 -DPICO_PLATFORM=rp2350-arm-s -DPICO_SDK_PATH=<root>/pico-sdk/ ..
make
build_tzpuPico.sh は RP2350 ビルド全体を処理します。picoZ80.h ボード定義を SDK にコピーし、現在のバージョンをバックアップし、CMake と make -j4 を実行し、ビルド成功時にバージョン番号をインクリメントし、生成されたファームウェアファイルをバージョン付きファイル名で projects/tzpuPico/fw/uf2/ と projects/tzpuPico/fw/bin/ にコピーします。fw/uf2/ ディレクトリには ブートローダー UF2 イメージ(USB マスストレージによる初期書き込みに使用)が、fw/bin/ ディレクトリには OTA アップデートに使用する アプリケーションパーティションのピュアバイナリ(.bin)イメージが格納されます。アプリケーションパーティションは UF2 フォーマットで表現できない非標準の Flash アドレスに配置されるため、すべての OTA 転送にはプレーンバイナリが使用されます。
スクリプトはオプションの引数を受け付けます。
cd <root>
<a name="standard-release-build-rp2350-only" id="standard-release-build-rp2350-only"></a>
# 標準リリースビルド(RP2350 のみ)
./build_tzpuPico.sh
<a name="debug-build-rp2350-only-cmake_build_typedebug" id="debug-build-rp2350-only-cmake_build_typedebug"></a>
# デバッグビルド(RP2350 のみ、CMAKE_BUILD_TYPE=Debug)
./build_tzpuPico.sh DEBUG
<a name="full-build-rp2350-firmware-plus-esp32-firmware-via-docker" id="full-build-rp2350-firmware-plus-esp32-firmware-via-docker"></a>
# フルビルド — RP2350 ファームウェアと Docker 経由の ESP32 ファームウェア
./build_tzpuPico.sh ALL
ビルドシステムは 4 つのファームウェアバリアントを生成します:標準(デバッグシェルなし)と DBGSH(ICE デバッガー付き)× 2 パーティション。DBGSH バリアントは
ESP32 ファームウェアを個別にビルドする
INCLUDE_DBGSH コンパイル定義で制御されます。
ESP32 ファームウェアは Docker を使用して独立してビルドすることもできます。シェルプロファイル(
~/.bashrc または ~/.zshrc)に次のエイリアスを追加し、esp32/ ディレクトリから idf54 を実行します。
<a name="add-to-shell-profile" id="add-to-shell-profile"></a>
# シェルプロファイルに追加
alias idf54='docker run --rm --privileged \
--volume /dev:/dev \
--volume /sys:/sys:ro \
--volume /dev/bus/usb:/dev/bus/usb \
-v $PWD:/project \
-w /project \
-it espressif/idf:release-v5.4 idf.py "$@"'
cd <root>/projects/tzpuPico/esp32
idf54 build
<a name="firmware-binary-buildtzpupico_esp32bin" id="firmware-binary-buildtzpupico_esp32bin"></a>
# ファームウェアバイナリ: build/tzpuPico_esp32.bin
<a name="upload-via-the-ota-web-page-ota-esp32htm-or-flash-directly-via-usb" id="upload-via-the-ota-web-page-ota-esp32htm-or-flash-directly-via-usb"></a>
# OTA ウェブページ(ota-esp32.htm)経由でアップロードするか USB から直接書き込む
書き込み
RP2350 の初期書き込み
picoZ80 ボードには物理的な BOOTSEL ボタンやリセットボタンがありません。両信号は 6 ピンデバッグヘッダーに引き出されています。
| ピン 1 | ピン 2 | ピン 3 | ピン 4 | ピン 5 | ピン 6 |
|---|---|---|---|---|---|
| SWCLK | SWD | Reset RP2350 | Reset ESP32 | GND | BOOTSEL |
RP2350 ブートローダーマスストレージモードに入るには、デバッグヘッダーのジャンパーまたはプローブを使用します。
ESP32 の初期書き込み
- ピン 6(BOOTSEL) を Low に保持します。
- 電源を投入するか、ピン 3(Reset RP2350) を Low にしてから解放します — RP2350 がブートを開始します。
- 電源投入またはリセット直後に BOOTSEL を解放します。初期ブート後も Low に保持し続けると RP2350 が FlashRAM にアクセスできなくなります。
- picoZ80 の USB ポートを PC に接続すると — RP2350 が USB マスストレージデバイスとして認識されます。
- マウントされたドライブに
Bootloader_<version>.uf2をコピーします。RP2350 がブートローダーを自己書き込みして再起動します。
ESP32 は Python 仮想環境経由の
esptool を使用して書き込みます。新しいボードリビジョンでは ESP32 が独自の USB デバイスとして認識されます。単一 USB ポートを持つオリジナルボードでは ESP32 は RP2350 が USB-UART ブリッジとして動作する場合にのみアクセスできました。いずれの場合も ピン 4(Reset ESP32) をデバッグヘッダーで使用し、必要に応じて RP2350 ブートシーケンス中に ESP32 をリセット状態に保持します。
esptool 環境を一度セットアップします。
python3 -m venv ./venv/
source ./venv/bin/activate
cd $HOME/esptool
次に 4 つの ESP32 ファームウェアコンポーネントをすべて 1 つのコマンドで書き込みます。
PORT を OS が割り当てるデバイスノードに合わせて変更し、BINPATH をビルドバイナリが格納されたディレクトリに設定してください。
PORT=/dev/tty.usbmodem141403 # お使いのシステムに合わせて変更
BINPATH=/path/to/build/output
python3 ./esptool.py \
-p ${PORT} -b 115200 \
--before default_reset --after hard_reset \
--chip esp32s3 \
write_flash \
--flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 ${BINPATH}/bootloader.bin \
0x8000 ${BINPATH}/partition-table.bin \
0x9000 ${BINPATH}/ota_data_initial.bin \
0x10000 ${BINPATH}/sd_card.bin
以降のすべての ESP32 ファームウェアアップデートは esptool を使用することなく OTA ウェブページ(
OTA アップデート(初期書き込み後)
ota-esp32.htm)から実行できます。
ボードリビジョンについての注意: オリジナルの picoZ80 ボード(v2.0〜v2.2)は RP2350 に接続された単一の USB ポートを持ちます。これらのボードでは ESP32 は RP2350 が USB-UART ブリッジとして動作することでプログラムする必要があります。新しいボードリビジョンでは ESP32 に直接接続された第 2 の USB ポートが追加されており、esptool が独立してアクセスできます。
- RP2350 OTA
-http://<device-ip>/ota-rp2350.htmにアクセスし、fw/bin/からバージョン付きの.binファイルを選択してアップロードします。アプリケーションパーティションは非標準の Flash アドレスにあるため、UF2 ではなくプレーンバイナリが必要です。ブートローダーが新しいパーティションをアクティブ化する前にイメージのチェックサムを検証します。 - ESP32 OTA
-http://<device-ip>/ota-esp32.htmにアクセスし、ESP32 ファームウェアバイナリをアップロードします。ESP32 は新しいファームウェアに自動的に再起動します。同じページではバージョン付きの FilePack アーカイブも受け付けており、SD カード上の ESP32 Web ファイルシステムを更新できます — 詳細は下記の FilePack アップロードを参照してください。
SD カードを FAT32 でフォーマットします。ルートディレクトリに
config.json を配置します。設定ファイルで参照する ROM イメージ・ディスクイメージ・ファイリングシステムツリー用のサブディレクトリを作成します。ボードが動作を開始したら、SD カードは Web ファイルマネージャーページからも完全に管理できます。
デバッグ
picoZ80 は RP2350 の両コアと ESP32 コプロセッサーの完全なソースレベルデバッグをサポートします。RP2350 は CMSIS-DAP プローブを使用した SWD でデバッグされ、OpenOCD がコアごとに 1 つの GDB サーバーポートを持つ 2 ターゲット GDB サーバーを提供します。ESP32-S3 はその組み込み USB-JTAG インターフェースと Xtensa ツールチェーン GDB を使用してデバッグされます。
RP2350 — SWD デバッグ
ハードウェア接続
ARM DAPLink / CMSIS-DAP プローブ(例:Raspberry Pi Debug Probe・Black Magic Probe・任意の CMSIS-DAP 互換アダプター)を picoZ80 ボードの 6 ピンデバッグヘッダーに接続します。必要な接続は 3 本だけです。
OpenOCD の起動
OpenOCD はコア 0 用にポート
ARM DAPLink / CMSIS-DAP プローブ(例:Raspberry Pi Debug Probe・Black Magic Probe・任意の CMSIS-DAP 互換アダプター)を picoZ80 ボードの 6 ピンデバッグヘッダーに接続します。必要な接続は 3 本だけです。
| デバッグヘッダーピン | 信号 | SWD 機能 |
|---|---|---|
| ピン 1 | SWCLK | シリアルワイヤークロック |
| ピン 2 | SWDIO | シリアルワイヤーデータ |
| ピン 5 | GND | グランド基準 |
OpenOCD はコア 0 用にポート
3333、コア 1 用にポート 3334 の 2 つの GDB サーバーポートを公開します。picoZ80 はコアごとに独立した GDB ポートを持つ真の SMP デバッグを有効にするために、標準の OpenOCD RP2350 ターゲットスクリプトへの小さな変更が必要です。標準スクリプトをコピーして target smp 行のコメントを解除します。
sudo cp /usr/local/share/openocd/scripts/target/rp2350.cfg \
/usr/local/share/openocd/scripts/target/rp2350_tzpu.cfg
次に
rp2350_tzpu.cfg を編集し — if {[string compare $_USE_CORE SMP] == 0} ブロック内の target smp 行を見つけて先頭の # を削除します。
# 変更前(rp2350.cfg):
#target smp $_TARGETNAME_0 $_TARGETNAME_1
# 変更後(rp2350_tzpu.cfg):
target smp $_TARGETNAME_0 $_TARGETNAME_1
この 1 行の変更により SMP モードが有効になり、OpenOCD がコア 0 を GDB ポート 3333 に、コア 1 をポート 3334 に登録し、各コアを独立してアタッチしてステップ実行できるようになります。GDB を起動する前にプロジェクトルートから OpenOCD を起動します。
openocd -f interface/cmsis-dap.cfg -f target/rp2350_tzpu.cfg -c "adapter speed 5000"
グローバル GDB 初期化(
GDB はディレクトリごとの
~/.gdbinit)GDB はディレクトリごとの
.gdbinit ファイルを自動ロードするための明示的な許可を必要とします。~/.gdbinit に以下を追加し、パスをプロジェクトの場所に合わせて変更してください(ここではプロジェクトルートからの相対パスで示しています — ~/.gdbinit には異なるディレクトリから GDB を実行する場合に備えて絶対パスを使用してください)。
set history save on set history filename ~/.gdb_history set history size 65536 add-auto-load-safe-path build/bin/model/BaseZ80/.gdbinit:build/bin/model/Bootloader/.gdbinitブートローダーのデバッグ
適切なコアごとの
.gdbinit ファイルをブートローダービルドディレクトリにコピーして gdb-multiarch を起動します。.gdbinit.bootloader.3333 はコア 0(ポート 3333)に接続して出力を gdb_core0.txt に記録します。.gdbinit.bootloader.3334 はコア 1(ポート 3334)に接続して gdb_core1.txt に記録します。両コアを同時にデバッグするには 2 つのターミナルを開きます。
# ターミナル 1 — コア 0 cd build/bin/model/Bootloader cp ../../../../.gdbinit.bootloader.3333 .gdbinit gdb-multiarch Bootloader.elf # ターミナル 2 — コア 1 cd build/bin/model/Bootloader cp ../../../../.gdbinit.bootloader.3334 .gdbinit gdb-multiarch Bootloader.elfメインファームウェアのデバッグ
メインファームウェアの
.gdbinit ファイル(.gdbinit.3333 と .gdbinit.3334)は、メモリを 16 進数と ASCII を組み合わせた出力でダンプするカスタムの xac <address> <count> コマンドを定義し、それぞれの GDB ポートに接続して実行を継続します。これはエミュレーションループを停止することなく PSRAM バンクの内容やメモリマップデバイス状態を検査するのに便利です。
# ターミナル 1 — コア 0 cd build/bin/model/BaseZ80 cp ../../../../.gdbinit.3333 .gdbinit gdb-multiarch BaseZ80_0x10020000.elf # ターミナル 2 — コア 1 cd build/bin/model/BaseZ80 cp ../../../../.gdbinit.3334 .gdbinit gdb-multiarch BaseZ80_0x10020000.elf # メモリダンプの例(GDB プロンプトで): (gdb) xac 0x20000000 64ESP32 — USB デバッグ
ESP32-S3 コプロセッサーには組み込みの USB-JTAG インターフェースがあるため、外部デバッグプローブは不要です。ホスト PC から picoZ80 ボードの ESP32 USB ポートに USB ケーブルで接続します。
ESP32-S3 の組み込み JTAG 設定を使用して OpenOCD を起動します。
openocd -f board/esp32s3-builtin.cfg
次に ESP32 ファームウェアの ELF(プロジェクトルートからの相対パスで
esp32/build/main.elf)を指定して Xtensa GDB を起動し、OpenOCD GDB サーバーにアタッチします。
xtensa-esp32s3-elf-gdb esp32/build/main.elf (gdb) target extended-remote :3333
ELF がデバイスに書き込まれたファームウェアと同じソースリビジョンでビルドされていることを確認し、シンボルとアドレスが正しく対応するようにしてください。
設定(JSON)
picoZ80 のすべての動作は SD カード上の
config.json で制御されます。RP2350 はブート時に ESP32 経由でこのファイルを読み込み、最小化して Flash に格納します。SD カードが存在しない場合は以前に格納された設定が使用されます。設定はブラウザーの設定エディターページから直接編集することもできます。
トップレベルの構造は次のとおりです。
{
"esp32": {
"core": {
"device": "Z80",
"mode": 0
},
"wifi": {
"override": 1,
"wifimode": "client",
"ssid": "MyNetwork",
"password": "MyPassword",
"ip": "192.168.1.192",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"dhcp": 0,
"webfs": "webfs",
"persist": 0
}
},
"rp2350": {
"core": {
"cpufreq": 300000000,
"psramfreq": 133000000,
"voltage": 1.10
},
"z80": [
{
"memory": [ ... ],
"io": [ ... ],
"drivers": [ ... ]
}
]
}
}
esp32 トップレベルオブジェクトは ESP32 コプロセッサーを設定します。core と wifi の 2 つのサブオブジェクトを含みます。
| キー | 型 | 説明 |
|---|---|---|
device |
文字列 | CPU デバイスタイプ — ESP32 が使用するプロセッサーペルソナを指定します。有効な値:"Z80"(picoZ80)、"6502"(pico6502)、"6512"(pico6512)。 |
mode |
整数 | デフォルト起動モード:0 = クライアント(ステーション)モード、1 = アクセスポイントモード。この値は NVS に保存され、WiFi マネージャーが上書きしていない場合に次回起動時に使用されます。 |
wifi オブジェクトは config.json から WiFi 認証情報とネットワーク設定を注入し、NVS に保存されている設定を上書きするための仕組みを提供します。初期プロビジョニングや Web WiFi マネージャーを使用せずに既知の良好なネットワーク設定を展開する場合に便利です。override を 0 に設定すると設定ファイルを完全に無視し、以前に保存された NVS 設定を使用します。
| キー | 型 | 説明 |
|---|---|---|
override |
0/1 | マスタースイッチ。1 = 以下のすべての設定を適用する;0 = このブロックを無視して保存済みの NVS 設定を使用する。 |
wifimode |
文字列 | "ap" はアクセスポイントモード(ESP32 が独自のネットワークを作成する);"client" はクライアント/ステーションモード(ESP32 が既存のネットワークに参加する)。 |
ssid |
文字列 | 作成する(AP モード)または参加する(クライアントモード)WiFi ネットワーク名(SSID)。 |
password |
文字列 | SSID の WiFi パスフレーズ。 |
ip |
文字列 | 固定 IP アドレス(例:"192.168.1.192")。dhcp が 0 の場合に AP モードとクライアントモードの両方で使用されます。 |
netmask |
文字列 | サブネットマスク(例:"255.255.255.0")。 |
gateway |
文字列 | デフォルトゲートウェイアドレス(例:"192.168.1.1")。 |
dhcp |
0/1 | クライアントモードのみ。1 = DHCP でアドレスを取得する;0 = 上記の固定 ip/netmask/gateway を使用する。 |
webfs |
文字列 | SD カード上の Web ファイルシステムルートディレクトリを上書きします(デフォルト "webfs")。代替の Web UI アセットを提供するために使用します。 |
persist |
0/1 | 1 = override がクリアされた後も再起動時に設定が維持されるよう解決された WiFi 設定を NVS に書き戻す;0 = 今回のセッションのみ適用する。 |
| キー | 型 | 説明 |
|---|---|---|
cpufreq |
整数 | RP2350 システムクロック周波数(Hz 単位。例:300MHz の場合 300000000)。 |
psramfreq |
整数 | PSRAM SPI クロック周波数(Hz 単位。例:133MHz の場合 133000000)。 |
voltage |
浮動小数点 | RP2350 コア電圧(ボルト単位。例:1.10)。高いクロック速度にはより高い電圧が必要になる場合があります。 |
memory 配列は Z80 メモリマップを定義します。各エントリは 64KB の Z80 アドレス空間の連続した領域をカバーし、512 バイトブロック境界に丸められます。
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | このエントリが有効かどうか。 |
addr |
16 進文字列 | Z80 アドレス空間の開始アドレス(例:"0x0000")。 |
size |
16 進文字列 | 領域のサイズ(例:8KB の場合 "0x2000")。 |
type |
文字列 | ブロックタイプ:PHYSICAL、PHYSICAL_VRAM、PHYSICAL_HW、RAM、ROM、VRAM、FUNC、PTR。 |
bank |
整数 | RAM/ROM/VRAM タイプの PSRAM バンク番号(0〜63)。 |
tcycwait |
整数 | アクセス時に挿入する追加 T サイクルウェイトステート数。 |
tcycsync |
整数 | T1 立ち上がりエッジとの同期を有効にするかどうか。 |
task |
文字列 | FUNC タイプブロックのオプションタスク識別子。 |
file |
文字列 | 起動時にこのブロックに読み込む ROM イメージの SD カードパス。 |
fileofs |
整数 | ROM イメージファイル内の読み込み開始バイトオフセット。 |
"memory": [
{
"enable": 1,
"addr": "0x0000",
"size": "0x1000",
"type": "ROM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "/TZFS/tzfs.rom",
"fileofs": 0
},
{
"enable": 1,
}
]
}
}
esp32 トップレベルオブジェクトは ESP32 コプロセッサを設定します。core と wifi の2つのサブオブジェクトを含みます。
| キー | 型 | 説明 |
|---|---|---|
device |
string | CPU デバイスタイプ — ESP32 が使用するプロセッサのパーソナリティを指定します。有効な値: "Z80" (picoZ80), "6502" (pico6502), "6512" (pico6512)。 |
mode |
integer | デフォルトの起動モード: 0 = クライアント(ステーション)モード、1 = アクセスポイントモード。この値は NVS に保存され、WiFi マネージャーによって上書きされていない場合、次回起動時に使用されます。 |
wifi オブジェクトは、config.json から WiFi 認証情報とネットワーク設定を注入し、NVS に保存されている設定を上書きするための仕組みを提供します。これは初期プロビジョニング時や、Web WiFi マネージャーを使用せずに既知の正常なネットワーク設定を展開する際に便利です。override を 0 に設定すると、設定ファイルを完全に無視し、以前に保存された NVS 設定を使用します。
| キー | 型 | 説明 |
|---|---|---|
override |
0/1 | マスタースイッチ。1 = 以下のすべての設定を適用する; 0 = このブロックを無視して保存済み NVS 設定を使用する。 |
wifimode |
string | "ap" はアクセスポイントモード(ESP32 が独自のネットワークを作成); "client" はクライアント/ステーションモード(ESP32 が既存のネットワークに参加)。 |
ssid |
string | 作成(AP モード)または参加(クライアントモード)する WiFi ネットワーク名(SSID)。 |
password |
string | SSID の WiFi パスフレーズ。 |
ip |
string | 固定 IP アドレス(例: "192.168.1.192")。dhcp が 0 のとき、AP モードとクライアントモードの両方で使用されます。 |
netmask |
string | サブネットマスク(例: "255.255.255.0")。 |
gateway |
string | デフォルトゲートウェイアドレス(例: "192.168.1.1")。 |
dhcp |
0/1 | クライアントモードのみ。1 = DHCP でアドレスを取得する; 0 = 上記の固定 ip/netmask/gateway を使用する。 |
webfs |
string | SD カード上の Web ファイルシステムルートディレクトリを上書きします(デフォルトは "webfs")。代替の Web UI アセットを配信できます。 |
persist |
0/1 | 1 = 解決された WiFi 設定を NVS に書き戻し、override がクリアされた後も再起動後に維持する; 0 = 今回のセッションのみ適用する。 |
| キー | 型 | 説明 |
|---|---|---|
cpufreq |
integer | RP2350 システムクロック周波数(Hz 単位、例: 300000000 で 300 MHz)。 |
psramfreq |
integer | PSRAM SPI クロック周波数(Hz 単位、例: 133000000 で 133 MHz)。 |
voltage |
float | RP2350 コア電圧(ボルト単位、例: 1.10)。クロック速度が高いほど、高い電圧が必要になる場合があります。 |
memory 配列は Z80 メモリマップを定義します。各エントリは 512 バイトブロック境界に丸められた、64KB Z80 アドレス空間の連続した領域をカバーします。
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | このエントリが有効かどうか。 |
addr |
hex string | Z80 アドレス空間内の開始アドレス(例: "0x0000")。 |
size |
hex string | 領域のサイズ(例: 8KB の場合 "0x2000")。 |
type |
string | ブロックタイプ: PHYSICAL, PHYSICAL_VRAM, PHYSICAL_HW, RAM, ROM, VRAM, FUNC, PTR。 |
bank |
integer | RAM/ROM/VRAM タイプの PSRAM バンク番号(0〜63)。 |
tcycwait |
integer | アクセス時に挿入する追加の T サイクルウェイトステート数。 |
tcycsync |
integer | T1 立ち上がりエッジとの同期を有効にする。 |
task |
string | FUNC タイプブロックのオプションタスク識別子。 |
file |
string | 起動時にこのブロックに読み込む ROM イメージへの SD カードパス。 |
fileofs |
integer | ROM イメージファイル内の読み込み開始バイトオフセット。 |
"memory": [
{
"enable": 1,
"addr": "0x0000",
"size": "0x1000",
"type": "ROM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "/TZFS/tzfs.rom",
"fileofs": 0
},
{
"enable": 1,
"addr": "0x1000",
"size": "0xCFFF",
"type": "RAM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "",
"fileofs": 0
},
{
"enable": 1,
"addr": "0xD000",
"size": "0x1000",
"type": "PHYSICAL_VRAM",
"bank": 0,
"tcycwait": 2,
"tcycsync": 0,
"task": "",
"file": "",
"fileofs": 0
}
]
io 配列は Z80 I/O ポート範囲をハンドラーにマッピングします。I/O サイクルはメモリサイクルと、PIO 制御ステートマシンが監視する Z80 IORQ 信号によって区別されます。
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | このエントリが有効かどうか。 |
addr |
hex string | 開始 I/O ポートアドレス(例: "0xE0")。 |
size |
hex string | 範囲内のポート数。 |
type |
string | PHYSICAL(ホストに渡す)、FUNC(C ハンドラーを呼び出す)。 |
func |
string | FUNC タイプのハンドラー関数名。 |
"io": [
{
"enable": 1,
"addr": "0xE0",
"size": "0x08",
"type": "FUNC",
"func": "mz700_io"
},
{
"enable": 1,
"addr": "0x00",
"size": "0xE0",
"type": "PHYSICAL"
}
]
drivers 配列は名前付きドライバーインスタンスを Z80 コンテキストにバインドします。各ドライバーは1つ以上のインターフェース("if" キーの下にリスト)を持ち、それぞれが ROM イメージの読み込み、アドレス範囲の再マッピング、I/O ポート範囲の再マッピング、およびパラメーターファイルの受信を行えます。
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | このドライバーが読み込まれるかどうか。 |
name |
string | ドライバー名(コンパイル済みドライバーと一致する必要があります。例: "MZ700", "RFS", "TZFS")。 |
type |
string | PHYSICAL または VIRTUAL。 |
if |
array | インターフェースオブジェクトの配列(下記参照)。 |
インターフェースオブジェクト (if[]):
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | このインターフェースが有効かどうか。 |
name |
string | インターフェースインスタンス名。 |
type |
string | PHYSICAL または VIRTUAL。 |
rom |
array | 起動時に PSRAM に読み込む ROM イメージ。 |
addrmap |
array | このインターフェースのアドレス再マッピングルール。 |
iomap |
array | このインターフェースの I/O ポート再マッピングルール。 |
param |
array | ドライバーに渡されるパラメーターファイル。 |
rom[] エントリ:
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | この ROM エントリが有効かどうか。 |
file |
string | ROM バイナリへの SD カードパス。 |
loadaddr |
array | ロードアドレス記述子(位置、アドレス、バンク、サイズ、ウェイトステート)。 |
addrmap[] エントリ:
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | このマッピングが有効かどうか。 |
srcAddr |
hex string | Z80 空間内のソースアドレス。 |
size |
hex string | マッピング領域のサイズ。 |
dstAddr |
hex string | 再マッピング後の宛先アドレス。 |
iomap[] エントリ:
| キー | 型 | 説明 |
|---|---|---|
enable |
0/1 | この I/O マッピングが有効かどうか。 |
srcAddr |
hex string | ソース I/O ポート。 |
size |
hex string | ポート数。 |
dstAddr |
hex string | 再マッピング後の宛先ポート。 |
16bit |
0/1 | 16 ビット I/O アドレッシングを使用するかどうか。 |
"drivers": [
{
"enable": 1,
"name": "MZ700",
"type": "PHYSICAL",
"if": [
{
"enable": 1,
"name": "main",
"type": "PHYSICAL",
"rom": [
{
"enable": 1,
"file": "/MZ700/mz700.rom",
"loadaddr": [
{
"enable": 1,
"position": 0,
"addr": "0x0000",
"bank": 0,
"size": "0x1000",
"tcycwait": 0,
"tcycsync": 0
}
]
}
],
"addrmap": [
{
"enable": 1,
"srcAddr": "0x0000",
"size": "0x1000",
"dstAddr": "0x0000"
}
],
"iomap": [
{
"enable": 1,
"srcAddr": "0xE0",
"size": "0x08",
"dstAddr": "0xE0",
"16bit": 0
}
],
"param": [
{
"enable": 1,
"file": "/config/mz700.cfg"
}
]
}
]
},
{
"enable": 1,
"name": "MZ-1E05",
"type": "PHYSICAL",
"if": [
{
"enable": 1,
"name": "fdc0",
"type": "PHYSICAL",
"rom": [],
"addrmap": [],
"iomap": [
{
"enable": 1,
"srcAddr": "0xD8",
"size": "0x04",
"dstAddr": "0xD8",
"16bit": 0
}
],
"param": [
{
"enable": 1,
"file": "/DSK/MZ700/disk0.dsk"
}
]
}
]
}
]
以下は、ROM、48KB RAM、ホスト VRAM、および WD1773 フロッピーコントローラーを備えた MZ-700 を起動する最小構成です:
{
"rp2350": {
"core": {
"cpufreq": 300000000,
"psramfreq": 133000000,
"voltage": 1.10
},
"z80": [
{
"memory": [
{ "enable":1, "addr":"0x0000", "size":"0x1000", "type":"ROM",
"bank":0, "tcycwait":0, "tcycsync":0, "task":"",
"file":"/MZ700/mz700.rom", "fileofs":0 },
{ "enable":1, "addr":"0x1000", "size":"0xCFFF", "type":"RAM",
"bank":0, "tcycwait":0, "tcycsync":0, "task":"", "file":"", "fileofs":0 },
{ "enable":1, "addr":"0xD000", "size":"0x1000", "type":"PHYSICAL_VRAM",
"bank":0, "tcycwait":2, "tcycsync":0, "task":"", "file":"", "fileofs":0 },
{ "enable":1, "addr":"0xE000", "size":"0x2000", "type":"PHYSICAL",
"bank":0, "tcycwait":0, "tcycsync":0, "task":"", "file":"", "fileofs":0 }
],
"io": [
{ "enable":1, "addr":"0xE0", "size":"0x08", "type":"FUNC", "func":"mz700_io" },
{ "enable":1, "addr":"0xD8", "size":"0x04", "type":"FUNC", "func":"wd1773_io" }
],
"drivers": [
{
"enable":1, "name":"MZ700", "type":"PHYSICAL",
"if": [{ "enable":1, "name":"main", "type":"PHYSICAL",
"rom":[], "addrmap":[], "iomap":[], "param":[] }]
},
{
"enable":1, "name":"MZ-1E05", "type":"PHYSICAL",
"if": [{ "enable":1, "name":"fdc0", "type":"PHYSICAL",
"rom":[], "addrmap":[], "iomap":[],
"param":[{ "enable":1, "file":"/DSK/MZ700/disk0.dsk" }] }]
}
]
}
]
}
}
ICE(デバッグシェル)
picoZ80 には、2 番目の USB CDC シリアルチャネル経由で ICE(In-Circuit Emulator)機能を提供する内蔵 ICE デバッグシェルが搭載されています。ターミナルエミュレーター(115200 baud、8N1)をデバッグシリアルポートに接続してください — picoZ80 を USB 接続すると 2 番目の COM/ttyACM ポートとして表示されます。シェルプロンプトは
コマンドリファレンス
dbg> です。
デバッグシェルは Z80 CPU エミュレーションのリアルタイム検査と制御のための 35 個のコマンドを提供します:
| コマンド | 構文 | 説明 |
|---|---|---|
| help | help |
利用可能なすべてのコマンドを表示。 |
| regs | regs |
Z80 レジスターをダンプ(AF、BC、DE、HL、IX、IY、SP、PC、I、R、IM、IFF1/2、フラグ、HALT、MEMPTR、サイクル数)。 |
| dm | dm [p|f|v|r] <addr> [len] |
メモリダンプ。p = 物理 Z80 バス、f = フェッチ(M1)サイクル、v = 仮想 PSRAM、r = RP2350 アドレス空間。 |
| dis | dis [p|v] [addr] [count] |
Z80 コードをディスアセンブル。 |
| asm | asm [addr] |
インタラクティブ Z80 アセンブラー。ニーモニックを行ごとに入力、空行または . で終了。 |
| memmap | memmap [block] |
SRAM バンクポインターテーブルを表示。 |
| memptr | memptr [addr] |
PSRAM memPtr テーブルを表示。 |
| iomap | iomap [port] |
I/O ポートハンドラーテーブルを表示。 |
| status | status |
システム概要:CPU 周波数、PSRAM クロック、ホストクロック、エミュレーション速度、稼働時間。 |
| ver | ver |
ファームウェアバージョンとパーティション情報。 |
| drivers | drivers |
アクティブなドライバーとインターフェースの一覧。 |
| hold | hold |
Z80 CPU エミュレーションを一時停止。 |
| release | release |
Z80 CPU エミュレーションを再開。 |
| go | go |
実行を続行(ホールド解除、ブレークポイントはアクティブなまま)。 |
| cont | cont |
go のエイリアス。現在のホールドポイントから実行を続行。ブレークポイントはアクティブなまま。 |
| step | step [n] |
1 回または n 回命令をシングルステップ実行、各ステップの前後にレジスター状態を表示。 |
| bp | bp <addr> |
指定アドレスにブレークポイントを設定(最大 8 個同時)。 |
| bc | bc <n|*> |
ブレークポイントスロット n をクリア、または * で全クリア。 |
| bl | bl |
アクティブなブレークポイントの一覧。 |
| wm | wm <[p|v]> <addr> <byte>... |
メモリにバイトを書き込み。p = 物理 Z80 バス、v = 仮想 PSRAM、省略時は自動(メモリマップに従う)。物理/マップ書き込み時は CPU を自動ホールド。 |
| fill | fill [p|v] <addr> <len> [w|d] <val> |
メモリを定数値で充填。p = 物理、v = 仮想、省略時は自動。デフォルトは 8 ビット、w = 16 ビット、d = 32 ビット(リトルエンディアン)。必要に応じて CPU を自動ホールド。 |
| in | in <port> |
Z80 I/O ポートを読み取り。 |
| out | out <port> <byte> |
Z80 I/O ポートに書き込み(CPU ホールド中のみ)。 |
| trace | trace <on|off|dump [n]|clear|rt|byte> |
実行トレースの有効/無効、最新 n エントリのダンプ、または 512 エントリリングバッファのクリア。rt でリアルタイムトレース出力。byte でバイトレベルトレース。 |
| set | set <reg|flags|memmap|memptr|iomap> |
Z80 レジスター、フラグ、メモリマップ、PSRAM memPtr、I/O マップエントリを実行時に変更。設定をリロードせずにメモリ/IO 構成をホットパッチ可能。 |
| hist | hist [n] |
コマンド履歴を表示。最後の n エントリを表示(デフォルト:全件)。履歴は ESP32 NVS に保存されセッション間で保持。 |
| save | save |
コマンド履歴を ESP32 NVS に即座に強制保存。 |
| fdctrace | fdctrace <on|off|dump> |
FDC I/O トレースログの有効/無効切替。dump でリングバッファから最後の 64 回の操作をダンプ。WD1773 レジスターへの全アクセスを 64 エントリのリングバッファに記録。パラメータなしで現在の状態を表示。 |
| qdtrace | qdtrace <on|off|dump> |
Quick Disk I/O トレースログの有効/無効切替。dump でリングバッファから最後の 64 回の操作をダンプ。パラメータなしで現在の状態を表示。 |
| piodbg | piodbg [clear] |
全 3 PIO ブロック(PIO 0、PIO 1、PIO 2)の RP2350 PIO ハードウェア診断を表示。FDEBUG スティッキーエラーフラグ、FSTAT、FIFO レベル、ステートマシンごとのプログラムカウンター、GPIO 出力イネーブル状態、GPIO ピンレベルを表示。clear で FDEBUG スティッキーフラグをリセット。 |
| cmp | cmp [f] <phys> <virt> <len> |
物理バスメモリと仮想 PSRAM を比較。f でフェッチ(M1)サイクルを使用。不一致をアドレスと値で報告。 |
| copy | copy <pv|fp|vp> <src> <len> <dst> |
物理メモリと仮想メモリ間でコピー。pv = 物理読み取り→仮想、fp = 物理フェッチ→仮想、vp = 仮想→物理書き込み。CPU を自動ホールド。 |
| memtest | memtest <addr> <len> [pattern] |
物理メモリを 3 パスでテスト:書き込み+読み取り、書き込み+フェッチ、インターリーブ。デフォルトパターン:昇順バイト。パスごとにエラーを報告。 |
| verify | verify <on|off> |
全オペコードフェッチ検証の切り替え。オン時は全フェッチを readPhysicalMem で検証(速度約 50% 低下)。オフ(デフォルト)時は 0x00/0xFF オペコードのみチェック。 |
| fwait | fwait <0-4> |
M1(オペコードフェッチ)サイクルに追加ウェイトステートを強制。0 = オフ(デフォルト)。タイミング依存のコードのデバッグに有用。パラメータなしで現在の設定を表示。 |
| iowait | iowait <0-8> |
I/O 読み書きサイクルに追加ウェイトステートを強制。0 = オフ(デフォルト)。応答の遅いペリフェラルの診断用。パラメータなしで現在の設定を表示。 |
| corrupt | corrupt [clear] |
検出されたフェッチ破損を表示(PC、フェッチされたオペコード、検証されたオペコード)。clear でログをリセット。 |
| echo | echo [on|off] |
文字エコーの切り替え。 |
| reset | reset |
Z80 CPU を強制リセット。 |
ブレークポイント — 最大 8 個のブレークポイントを同時にアクティブにできます。ブレークポイントにヒットすると CPU は自動的にホールドされ、ヒットしたアドレスが表示されます。
go で続行、step でブレークポイントからシングルステップ実行できます。
実行トレース — 有効にすると、実行された各命令の PC、オペコード、フラグレジスターが 512 エントリのリングバッファに記録されます。trace dump で完全なディスアセンブリ付きの最近の実行履歴を確認できます。
メモリアクセスモード — dm p は物理 Z80 バス経由でメモリを読み取り(実際のハードウェア応答を発生)、dm f はフェッチ(M1)サイクルで物理バスから読み取り、dm v は仮想 PSRAM から直接読み取り(バスアクティビティなし)、dm r は RP2350 自体のアドレス空間(Flash、SRAM、ペリフェラル)を読み取ります。
ネットワーク
picoZ80 は 3 つのネットワークモードをサポートしており、ビルド時に ESP32 の sdkconfig ファイルで選択します。各モードにより Web インターフェースおよび設定ページへのアクセス方法が決まります。
動作モード
| モード | sdkconfig ファイル | WiFi | USB NCM | コンソール | Web アクセス |
|---|---|---|---|---|---|
| WiFi のみ | sdkconfig.mode_wifi_only |
あり | なし | USB Serial/JTAG | WiFi AP または接続済みネットワーク経由 |
| WiFi + NCM | sdkconfig.mode_wifi_and_ncm |
あり | あり | TinyUSB CDC-ACM | WiFi および http://192.168.7.1 |
| NCM のみ | sdkconfig.mode_ncm_only |
なし | あり | TinyUSB CDC-ACM | http://192.168.7.1 のみ |
USB NCM(Network Control Model)は、ESP32 の USB OTG ポート経由で仮想 Ethernet アダプターを提供します。picoZ80 を USB でホストコンピューターに接続すると、ホスト側に標準的なネットワークインターフェースが表示されます。picoZ80 内蔵の DHCP サーバーがホストに自動的に IP アドレスを割り当てるため、手動設定は不要です。Web インターフェースは
FCC / RED 規制に関する注意事項
http://192.168.7.1 でアクセスできます。
NCM のみモードは、WiFi 認証なしで出荷されるボードの推奨デフォルトです。無線周波数の放射なしに、Web インターフェースの全機能(設定、ファームウェア更新、ファイル管理、ペルソナ選択)を提供します。PCB 上の WiFi アンテナ整合回路を実装する必要はありません。
WiFi + NCM モードは、両方のインターフェースを同時に有効にします。HTTP サーバーは全インターフェースにバインドされるため、WiFi または USB ネットワーク接続のどちらからでも Web ページにアクセスできます。WiFi は非同期で接続されるため、USB NCM インターフェースは電源投入直後から利用可能です。
モードを切り替えるには、ESP32 ビルドディレクトリ内で適切な sdkconfig.mode_* ファイルを sdkconfig にコピーし、再ビルドして ESP32 ファームウェアをフラッシュします。
重要:picoZ80 ボードは FCC(米国)または RED(EU)の意図的放射体認証を受けていません。出荷時は、WiFi アンテナ整合部品を未実装とし、ESP32 ファームウェアを NCM のみ構成(
sdkconfig.mode_ncm_only)でビルドする必要があります。この構成では無線周波数エネルギーは放射されず、意図的放射体規制の対象外となります。
WiFi を使用したいエンドユーザーは、PCB 上のアンテナ整合回路を実装し、sdkconfig.mode_wifi_only または sdkconfig.mode_wifi_and_ncm で ESP32 ファームウェアをビルドし、各管轄区域で適用されるホビイスト/実験用免除規定のもとでボードを運用できます。WiFi を有効にした状態でボードを商業的に販売する場合は、完成品としての FCC および/または RED 認証を事前に取得する必要があります。
Web インターフェース
ESP32 コプロセッサは Bootstrap 4 で構築された Web 管理インターフェースをホストします。picoZ80 の WiFi ネットワークに接続(またはクライアントモードで既存のネットワークに参加するよう設定)し、
ダッシュボード — ステータス (index.htm)
http://<device-ip>/ に移動します — アクセスポイントモードではデフォルトで http://192.168.4.1/ です。NCM モードでは、USB ネットワーク接続を介して http://192.168.7.1 で Web インターフェースにアクセスします。モードの詳細は上記のネットワークセクションを参照してください。
初回電源投入時、ボードは WiFi AP モードで起動します。WiFi マネージャーページを使用してクライアントモードを設定し、ネットワーク上に固定 IP アドレスを割り当てます。8つのページすべてで、ステータス、設定エディター、GUI 設定、ファイルマネージャー、設定(ファームウェア → ESP32 / RP2350、WiFi マネージャー)、およびペルソナへのワンクリックアクセスを提供する共通の左側ナビゲーションバーが使用されます。NCM のみモード(sdkconfig.mode_ncm_only)では、WiFi マネージャーはナビゲーションバーに表示されません — USB NCM 経由でネットワーク接続が自動的に提供されるため、ユーザー設定は不要です。
ランディングページには、3つのパネルにわたってボードのライブ状態が表示されます:
- WiFi 設定 / ネットワーク設定
- WiFi モードでは、現在の SSID、割り当てられた IP アドレス、ネットマスク、ゲートウェイが表示されます。NCM のみモードでは、このパネルは「ネットワーク設定」と表示され、USB NCM ネットワークの状態(IP アドレス、ネットマスク、ゲートウェイ)が表示されます。ボード名(tzpuPico)と著作権文字列は、ESP32 Web サーバーによってテンプレート変数として提供されます。 - バージョン情報
- すべての OTA スロットをタイプ、サブタイプ、フラッシュアドレス、サイズ、ファームウェアバージョン、ビルドタイムスタンプ、および現在実行中のスロットとともに表示する ESP32 パーティションテーブル。これにより、OTA アップデート後にどのファームウェアがアクティブかを簡単に確認できます。 - RP2350 パーティション
- パーティション番号、アドレス、サイズ、チェックサム、アクティブ/実行中フラグ、ライセンス、作者、説明、バージョン、ビルド日付、著作権を含む RP2350 フラッシュパーティションテーブル — ESP32 情報と並んで RP2350 ファームウェア状態の完全なスナップショットを提供します。
- アクションメニュー
- フロッピーディスク 1 / 2 の変更 — SD カードから新しい DSK イメージファイルを選択し、再起動なしで仮想 WD1773 フロッピーコントローラーのスロット 1 またはスロット 2 にマウントします。
- QD ディスクの変更 — アクティブな QuickDisk イメージファイルをその場でスワップします。
- RP2350 設定の再読み込み — ESP32–RP2350 UART 経由で RP2350 に再読み込みコマンドを送信します。RP2350 はconfig.jsonを再解析し、完全な電源サイクルなしにメモリマップとドライバー設定を再適用します。 - 再起動メニュー
- ESP32 — ESP32 コプロセッサをソフト再起動します(Web サーバーと WiFi スタックを再起動し、RP2350 には影響しません)。
- RP2350B — RP2350 プロセッサをリセットします(ブートローダーを再実行してアクティブなファームウェアスロットを再読み込みし、リセット中はホスト CPU が一時停止されます)。
- ホスト — ホストコンピューターのリセットラインをアサートし、picoZ80 ボード自体に影響を与えることなく Z80 ソケット内のレガシーコンピューターを再起動します。

設定エディターページは jSON 設定ファイルへの完全な編集コントロールを提供します。
WYSIWYG エディターを使用して設定を変更し、必要に応じて保存し、「適用」をクリックして設定を再処理します。
SD カードは保存されたすべての設定の自動番号付きバックアップを保持します(
config.json;1、config.json;2、…最大番号が最新)。そのため、以前の動作設定にロールバックすることが常に可能です。編集された設定は SD カードに保存され直します。「適用」または「再読み込み」メニューアクションをクリックすると、ESP32–RP2350 UART 経由で RP2350 に再読み込みコマンドが送信され、RP2350 が新しい設定を再解析して再適用し、ESP32 もその設定を解析して再読み込みします。

GUI 設定ページは、picoZ80 の設定をグラフィカルなフォームベースのエディターで提供し、JSON Config Editor を補完します。JSON を直接編集する代わりに、すべての設定がラベル付き入力フィールド、ドロップダウンメニュー、編集可能なテーブルとして表示されます。変更は SD カード上の
config.json に保存されます(保存前に既存ファイルが自動バックアップされます)。GUI で対応できない高度な編集には、Config Editor で直接 JSON を操作できます。
ページは 4 つのタブで構成されています:
RP2350 グローバル — 両パーティションに適用されるグローバルコア設定(パーティションレベルで上書き可能):
- コア電圧 — RP2350 コア電圧(例:1.10 V)。
- CPU 周波数(MHz) — RP2350 クロック速度。有効範囲がフィールド横に表示されます。
- PSRAM 周波数(MHz) — PSRAM SPI クロック周波数。高い値はエミュレーション速度を向上させますが、一部のボードでは安定性が低下する場合があります。

パーティション 1 / パーティション 2 — パーティションごとの設定。各タブは同じレイアウトです:
- コア設定 — コア電圧、CPU 周波数、PSRAM 周波数のパーティション固有オーバーライド。
- メモリリージョン — Z80 メモリマップを定義する編集可能なテーブル。各行:16 進アドレス、サイズ、タイプ(ROM、RAM、PHYSICAL、FUNC)、T ステート(ウェイトステート)、バンク、トラック、ファイル(SD カード上の ROM イメージ)、ファイルオフセット、ロードチェックボックス。行の追加・削除ボタン付き。
- I/O リージョン — Z80 I/O ポートマップの編集可能なテーブル。各行:アドレス、サイズ、タイプ、ファンクション。
- ドライバー — アクティブなペリフェラルドライバー(例:MZ80AFI、RFS)の一覧。有効/無効トグル付き。Add Driver ボタンで追加可能。


ESP32 — ESP32 コプロセッサー設定:
- コア — ESP32 デバイスタイプ(例:S3S)。
- WiFi 設定 — SSID、パスワード、IP アドレス、ネットマスク、WiFi モード(アクセスポイント/クライアント)、DHCP(有効/無効)、WebFS ディレクトリパス、ポーリング間隔、TX パワー。

Save Configuration をクリックすると、変更が SD カードの
ファイルマネージャー (filemanager.htm)
config.json に書き込まれ(以前のバージョンは自動バックアップ)、自動的に RP2350 に再読み込みコマンドが送信されて、完全な電源サイクルなしで新しい設定が適用されます。Reload をクリックすると、SD カードから現在の config.json を再読み込みします — 変更を破棄して最後に保存した状態からやり直したい場合に便利です。
ファイルマネージャーは SD カードの完全な Web ベースのファイルブラウザーを提供し、SD カード上のファイルを表示するディレクトリ一覧レイアウトを備えています。
これは一般的な SD カードのメンテナンスを目的としており、カードを取り出すことなく ROM イメージ、フロッピーディスクイメージ(DSK)、QuickDisk イメージ(QD)、RAM ディスクイメージ、Web ファイルシステムのアップデートをアップロードできます。
各エントリにはコピー、削除、ダウンロード、またはテキストファイルの編集のためのアクションボタンがあり、上部のファイルを選択アップロードボタンで PC から新しいファイルを転送できます。ディレクトリナビゲーションにより、
roms/、dsk/、qd/、ram/ などのサブディレクトリに移動できます。
tar または gzip ファイルをアップロードすると、tar または gzip(または tar.gz)ファイルが自動的に展開・解凍され、現在の SD ディレクトリに展開されます。

ペルソナページは、2つの RP2350 ファームウェアパーティションそれぞれについてアクティブなマシンのパーソナリティを独立して設定します。各パーティションには、サポートされているすべての Sharp MZ マシンタイプをカバーするラジオボタンの独自の列があります:
- Basic CPU — マシン固有のドライバーなしの純粋な Z80 エミュレーション。汎用 Z80 開発に便利です。
- MZ-80A および MZ-80B — Sharp MZ-80 シリーズ(1Z-013A モニター ROM、MZ-80 キーボード、標準メモリマップ)。
- MZ-700 — バンク切り替え VRAM、キーボードコントローラー、およびオプションのフロッピー/QuickDisk ドライバーを備えた Sharp MZ-700。
- MZ-800 — 拡張ビデオモードと QuickDisk サポートを備えた Sharp MZ-800。
- MZ-1500 — QuickDisk とオプションのフロッピーを備えた Sharp MZ-1500。
- MZ-2000、MZ-2200、MZ-2500 — 高解像度ビデオと拡張メモリを備えた後期の Sharp MZ シリーズ。
config.json が SD カードに書き込まれ(現在のファイルをバックアップした後)、設定の再読み込みがトリガーされます。各ファームウェアパーティションに異なるペルソナを保持できるため、SD カードを編集することなく、例えばパーティション 1 の MZ-700 パーソナリティとパーティション 2 の MZ-80A パーソナリティを切り替えることができます。

ESP32 OTA ページは、ファームウェアのアップロードを受け付ける前に ESP32 のソフトウェアインベントリ全体を報告します:
- モジュールパネル
- 各 ESP32 ソフトウェアコンポーネントのバージョンを表示します: メイン ESP32 アプリケーション、NVS(不揮発性ストレージ)ライブラリ、WiFi スタック、FilePack(Web ファイルシステムパッケージャー)、WebFS(フラッシュ内 Web ファイルシステム)。これにより、アップデート後にすべてのコンポーネントが一貫していることを簡単に確認できます。 - ESP32 パーティションパネル
- ESP32 OTA パーティションテーブル(otadata、nvs、phy_init、ota_0、ota_1)全体をアドレス、サイズ、ファームウェアバージョン、ビルドタイムスタンプ、および現在アクティブな OTA スロット("Yes" と表示)とともに表示します。 - ESP32 ファームウェアアップロードパネル
- ESP-IDF ビルドで生成された ESP32 バイナリ(.bin)を受け付けます。アップロード後、ESP32 は新しいファームウェアで再起動し、古いスロットはフォールバックとして保持されます。 - FilePack アップロードパネル
- バージョン管理された FilePack アーカイブを SD カードにアップロードします。FilePack は、すべての ESP32 静的 Web アセット(HTML、CSS、JavaScript テンプレート、および補助ファイル)を単一の配布可能なアーカイブにまとめます。アップロード時に ESP32 はアーカイブを SD カードの Web ファイルシステムディレクトリに展開します。置き換えられるファイルは自動的に以前のバージョン番号を含むようにリネームされます(例:webfs→webfs.2.80)。これにより、ロールバック用に古いバージョンが保持されます。これは SD カードの他の場所で使用される VAX/VMS スタイルのバージョン管理と一致しており、編集可能なファイルの各連続改訂は数値サフィックス付きで保存されます:config.json;1、config.json;2など — 編集が静かに上書きされることはありません。

RP2350 OTA ページは、2つの RP2350 ファームウェアパーティションを管理します:
- RP2350 パーティションパネル
- 3つのパーティションをすべてリストします: パーティション 0(ブートローダー)、パーティション 1(最初のアプリケーションスロット、例: "Z80 CPU Emulator")、パーティション 2(2番目のスロット)。各行にはフラッシュアドレス、サイズ、チェックサム、アクティブ/実行中フラグ、ライセンス、作者、説明、バージョン、ビルド日付が表示されます。現在実行中のパーティションはアクティブ列に "Yes" と表示されます。 - RP2350 ファームウェアアップロードパネル
-fw/bin/からの純粋なバイナリ.binファームウェアファイルを受け付けます。UF2 は使用されません — アプリケーションパーティションは UF2 が表現できない非標準のフラッシュアドレスに配置されているため、OTA 転送には生のバイナリを使用します。パーティション 1 / パーティション 2 ラジオボタンを使用してターゲットスロットを選択し、オプションでアプリ設定のクリアにチェックを入れると関連する設定パーティションが消去されます(互換性のない設定スキーマを持つファームウェアバージョンにアップグレードする際に便利です)。アップロードは新しいパーティションがアクティブ化される前にチェックサムで検証されます。 - RP2350 アクティブパーティションパネル
- 新しいファームウェアをアップロードせずにアクティブパーティションを独立して切り替えます。ここでパーティションを選択すると、選択したスロットへの自動再起動がトリガーされます — ファイル転送なしで2つの事前読み込み済みファームウェアバリアント(例: Z80 とテストビルド)を切り替えるのに便利です。

このページは WiFi が有効な場合(
sdkconfig.mode_wifi_only または sdkconfig.mode_wifi_and_ncm)にのみ表示されます。NCM のみモードではこのページはナビゲーションに表示されません — USB NCM 経由でネットワーク接続が自動的に提供されるため、ユーザー設定は不要です。
WiFi マネージャーは picoZ80 がネットワークに接続する方法を設定します。上部パネルには現在アクティブな WiFi 設定(SSID、割り当てられた IP、ネットマスク、ゲートウェイ)が表示されます。その下の WiFi 設定フォームはすべての設定を公開します:
- WiFi モード
- アクセスポイント: picoZ80 が独自の SSID をブロードキャストし、直接接続します(初期セットアップ時やインフラネットワークが利用できない場合に便利)。クライアント: picoZ80 がステーションとして既存の WiFi ネットワークに参加します。 - SSID とパスワード
- 参加(クライアントモード)またはブロードキャスト(AP モード)するネットワークの名前とパスフレーズ。 - DHCP モード
- 有効: ボードがネットワークの DHCP サーバーからアドレスを要求します。無効: 下のフィールドに入力した静的 IP、ネットマスク、ゲートウェイを使用します。Web インターフェースのアドレスが常に予測可能であるよう、固定 IP が推奨されます。

参考サイト
以下の表には、picoZ80 の設計とプログラミングで参照されたすべてのサイトが含まれています。
| サイト | 言語 | 説明 |
|---|---|---|
| RP2350 Datasheet | English | Raspberry Pi RP2350 の公式技術リファレンスおよびデータシート。 |
| Pico SDK | English | Raspberry Pi Pico C/C++ SDK — picoZ80 ファームウェアで使用されるビルドシステムとハードウェア抽象化。 |
| Z80 CPU User Manual | English | Zilog Z80 CPU ファミリーユーザーマニュアル — バスタイミング、命令セット、信号の説明。 |
| ESP-IDF | English | ESP32 コプロセッサファームウェアに使用される Espressif IoT 開発フレームワーク。 |
| Sharp MZ Series | English | Sharp MZ コンピューターのハードウェア、ソフトウェア、技術文書のコミュニティリソース。 |
マニュアルおよびデータシート
以下の表には、picoZ80 の設計とプログラミングで参照されたすべてのデータシートとマニュアルが含まれています。
| データシート | 言語 | 説明 |
|---|---|---|
| RP2350 | English | Raspberry Pi RP2350 マイクロコントローラーデータシート。 |
| ESP32-S3 | English | Espressif ESP32-S3 SoC データシート — picoZ80 ボード上の WiFi/BT コプロセッサ。 |
| APS6404L PSRAM | English | 8MB SPI PSRAM データシート — メモリバンキングに使用されるメイン拡張 RAM。 |
| W25Q128 Flash | English | Winbond 16MB SPI NOR フラッシュデータシート — ファームウェアと ROM イメージを保存。 |
| TLV62590 | English | Texas Instruments 5V→3.3V 同期バックコンバーター。Z80 DIP-40 VCC ピンから picoZ80 に電力を供給。 |
| CH334F | English | CH334F 4 ポート USB 2.0 ハブコントローラー — ファームウェアアップデート用の USB ハブ機能を提供。 |
プロジェクトプレビュー
picoZ80 プロジェクトの初期開発プレビューは X(旧 Twitter)で共有されました。以下の投稿は初めてボードが動作した様子を示しています:
https://x.com/engineerswork1/status/1953171627065188841
デモンストレーションビデオ
picoZ80 が RFS(ROM ファイリングシステム)を実行中 — デモ 1
Sharp MZ-700 に搭載された picoZ80 が ROM ファイリングシステム(RFS)ペルソナを実行しています。このビデオはボードの仮想ディスクとメモリバンキング機能をデモンストレーションしています。
Z80 CPU テスターボードで picoZ80 をテストする短いクリップ。テスターは picoZ80 が本物の Z80 であることを検証し、NMOS Z80 として識別し、8 MHz でテストコードを実行して正常動作を確認します。
Sharp MZ-80A に搭載された picoZ80 v2.5 で、物理カセットテープからプログラムをロード。カセットロードは非常にタイミングがシビアで、Z80 はテープハードウェアからのシリアルデータストリームをタイミングエラーの余地なくリアルタイムでビットバングする必要があります。このビデオは、picoZ80 が本物の Z80 と同様にクリティカルな CMT タイミングを処理できることを実証しています。
Sharp MZ-80A の picoZ80 v2.5 で、実際のフロッピーディスクコントローラーと物理ディスクドライブからの読み取りを実行。フロッピーディスクアクセスには Z80 と WD1773 FDC ハードウェア間の精密でタイミングクリティカルなインタラクションが必要で、DRQ は厳密なタイミングウィンドウ内にサービスされなければデータが失われます。このビデオは、picoZ80 が本物の Z80 と同様にタイミングクリティカルな実ハードウェアと正しくインタラクトできることを実証しています。
Sharp MZ-2000 に搭載された picoZ80 v2.5a で、完全物理モードで動作 — すべての ROM、RAM、VRAM アクセスは実際の MZ-2000 ハードウェアにパススルーされます。フロッピーディスクコントローラーは仮想化されており、picoZ80 が MB8866 FDC をエミュレートし SD カードからディスクイメージを提供する一方、マシンの残りの部分はオリジナルハードウェアで動作します。
商業利用の制限
明示的な書面による許可なしに商業利用は認められません。
picoZ80 のハードウェア設計(回路図、PCB レイアウト、KiCad ファイル)、ファームウェア、およびすべての関連ソフトウェアは、個人的、教育的、および非商業的利用のみを目的として提供されています。この設計のいかなる部分も — PCB アートワーク、部品表、ファームウェアバイナリ、ソースコード、文書を含みますがこれに限定されません — 著者(Philip D. Smart)の明示的な書面による許可なしに、商業的な製品またはサービスに使用、複製、製造、販売、または組み込むことはできません。
商業ライセンスを申請するか、許可される利用について相談するには、eaw.app ウェブサイトから著者にお問い合わせください。
クレジット
picoZ80 プロジェクトは複数の個人とオープンソースプロジェクトの成果を基に構築されています。その貢献に心より感謝申し上げます。
- Manuel Sainz de Baranda y Goñi
Z80 C 言語 Z80 CPU エミュレーターライブラリの作者(github.com/redcode/Z80)。この高精度サイクル精度 Z80 エミュレーターコアは、RP2350 上で Z80 命令を内部的に実行する際に picoZ80 ファームウェアで使用され、正確なフラグ動作と未文書化オペコードのサポートを提供します。このライブラリは GNU General Public License v3 の条件の下で使用されています。 - Raspberry Pi Ltd
Pico SDK および RP2350 ハードウェアの作者。PIO アセンブラー、C SDK、CMake ツールチェーン統合、および RP2350B シリコンがサイクル精度バスインターフェースを可能にします。 - Espressif Systems
ESP-IDF フレームワークおよび ESP32 ハードウェアの作者。ESP32 コプロセッサ、WiFi スタック、OTA ライブラリ、および NVS ストレージフレームワークが Web 管理インターフェースを支えています。 - Philip Smart
ハードウェア設計(KiCad 回路図および PCB レイアウト)、RP2350 PIO ファームウェア、ESP32 Web アプリケーション、JSON 設定システム、Sharp MZ マシンペルソナドライバー、およびすべてのプロジェクト文書。 - Grok (xAI)
PIO ステートマシンのデバッグ中に貴重なサポートを提供した AI アシスタント — 特に RP2350 PIO プログラムのタイミングエッジケースとサイクル精度バス相互作用の問題の診断において。 - Claude (Anthropic)
複数の分野にわたってこのプロジェクトに貢献した AI アシスタント: プロジェクト文書の作成と構造化、RP2350 と ESP32 間の FSPI/UART インターフェースの分析とファームウェア改善の推奨、および継続的なファームウェア開発支援。
ライセンス
picoZ80 プロジェクトは複数のコンポーネントで構成されており、それぞれに独自のライセンスが適用されています:
簡潔に言えば: ファームウェアとソフトウェアは GPL v3 の下でオープンソースです。ハードウェア設計とドキュメントは CC BY-NC-SA 4.0 の下でライセンスされています(非商用利用のみ — 商用ライセンスはリクエストに応じて提供可能)。サードパーティライブラリは上記に示した各自のライセンスを保持します。詳細はリポジトリ内の
| コンポーネント | ライセンス |
|---|---|
| picoZ80 RP2350 ファームウェア(PIO、C ソース) | GNU General Public License v3 |
| picoZ80 ESP32 ファームウェアおよび Web インターフェース | GNU General Public License v3 |
| Z80 CPU エミュレーターライブラリ(Manuel Sainz de Baranda y Goñi) | GNU General Public License v3 |
| KiCad ハードウェア設計ファイル(回路図、PCB、ガーバー) | Creative Commons BY-NC-SA 4.0 |
| ドキュメントおよびユーザーガイド | Creative Commons BY-NC-SA 4.0 |
| Raspberry Pi Pico SDK | BSD 3-Clause |
| ESP-IDF フレームワーク | Apache License 2.0 |
| Bootstrap 4(Web インターフェース) | MIT License |
LICENSE および NOTICE ファイルをご覧ください。
ライセンス条項
Copyright © 2019–2026 Philip Smart. All rights reserved.
ハードウェア設計 — CC BY-NC-SA 4.0
すべてのハードウェア設計(KiCad 回路図、PCB レイアウト、ガーバー製造ファイル、部品表)は Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License の下でライセンスされています。適切なクレジットを表示し、同じライセンスの下で変更を配布する限り、非商用目的でのみ設計を共有および改変することができます。商用製造または販売には別途ライセンスが必要です — info@eaw.app までご連絡ください。 ファームウェアおよびソフトウェア — GNU GPL v3
ファームウェアおよびソフトウェアのソースコードは GNU General Public License v3 の下でフリーソフトウェアです。GPL v3 の条件に基づいてコードを再配布および改変することができます。配布される変更は GPL v3 の下でライセンスされ、ソースコードが公開されなければなりません。 商標および帰属表示
picoZ80、pico6502、および engineers@work の名称は Philip Smart の商標です。書面による許可なくこれらの名称を派生製品の宣伝に使用することはできません。著作権表示、著者の帰属表示、またはブート/スプラッシュ画面のクレジットを削除または変更することはできません。このプロジェクトをリブランドして自分の作品として提示することは明示的に禁止されています。詳細はリポジトリ内の
picoZ80 または pico6502 ボードの商用販売を目的とした製造に関心のあるメーカーまたは販売代理店の方は、info@eaw.app までご連絡ください。個人使用、教育目的、および趣味/クラブでの使用は、上記のオープンソースライセンスの条件の下で常に許可されています。 完全なライセンステキストはリポジトリ内に
すべてのハードウェア設計(KiCad 回路図、PCB レイアウト、ガーバー製造ファイル、部品表)は Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License の下でライセンスされています。適切なクレジットを表示し、同じライセンスの下で変更を配布する限り、非商用目的でのみ設計を共有および改変することができます。商用製造または販売には別途ライセンスが必要です — info@eaw.app までご連絡ください。 ファームウェアおよびソフトウェア — GNU GPL v3
ファームウェアおよびソフトウェアのソースコードは GNU General Public License v3 の下でフリーソフトウェアです。GPL v3 の条件に基づいてコードを再配布および改変することができます。配布される変更は GPL v3 の下でライセンスされ、ソースコードが公開されなければなりません。 商標および帰属表示
picoZ80、pico6502、および engineers@work の名称は Philip Smart の商標です。書面による許可なくこれらの名称を派生製品の宣伝に使用することはできません。著作権表示、著者の帰属表示、またはブート/スプラッシュ画面のクレジットを削除または変更することはできません。このプロジェクトをリブランドして自分の作品として提示することは明示的に禁止されています。詳細はリポジトリ内の
NOTICE ファイルをご覧ください。
商用ライセンスpicoZ80 または pico6502 ボードの商用販売を目的とした製造に関心のあるメーカーまたは販売代理店の方は、info@eaw.app までご連絡ください。個人使用、教育目的、および趣味/クラブでの使用は、上記のオープンソースライセンスの条件の下で常に許可されています。 完全なライセンステキストはリポジトリ内に
LICENSE、LICENSE-HARDWARE.txt、および LICENSE-SOFTWARE.txt として含まれています。
無線規制に関する注意事項
本デバイスは ESP32-S3-PICO-1 無線モジュールを搭載しており、WiFi 有効時には 2.4 GHz ISM 帯で送信可能であるため、世界各国の無線周波数規制(米国では FCC Part 15 Subpart C、欧州連合では無線機器指令 2014/53/EU を含む)における意図的放射体に該当します。
未認証ボードの NCM のみデフォルト
picoZ80 は完成品としての FCC または RED 認証を受けていないため、ボードは WiFi アンテナ整合回路を未実装とし、ESP32 ファームウェアを NCM のみ構成(
本設計から構築されたデバイスが、当該管轄区域のすべての適用される無線周波数規制に準拠していることを確認するのは、製作者の全責任です。著者は本設計を個人的、教育的、およびホビー用途向けに提供しており、本設計から構築されたデバイスが商業配布の規制要件を満たすことを表明するものではありません。
picoZ80 は完成品としての FCC または RED 認証を受けていないため、ボードは WiFi アンテナ整合回路を未実装とし、ESP32 ファームウェアを NCM のみ構成(
sdkconfig.mode_ncm_only)でビルドして出荷する必要があります。この構成では無線周波数エネルギーは放射されず、意図的放射体規制の対象外となります。完全な Web インターフェースは USB 経由で http://192.168.7.1 からアクセスできます。詳細は上記のネットワーク — FCC / RED 規制に関する注意事項セクションを参照してください。
ESP32-S3-PICO-1 モジュール自体は既存の規制認証(FCC、CE など)を取得していますが、モジュールレベルの認証は、モジュールを組み込んだ完成品に自動的には適用されません。事前認証モジュール免除により、個人のホビイストが個人的、実験的、または教育目的で限定数のデバイスを、別途機器認可を取得することなく製作することが認められています。
重要な制限事項- WiFi を有効にした組立済みデバイスは、完成品が当該管轄区域で独自に試験を受け、機器認可(例: FCC ID、通知機関による評価を伴う CE マーキング)を取得しない限り、販売、販売の申出、贈与、その他の第三者への配布を行ってはなりません。
- 他者に出荷または配布するボードは、WiFi アンテナ整合回路を未実装とし、NCM のみファームウェア構成を使用する必要があります。
- WiFi を有効にした状態で限定数の個人使用目的の本プロジェクトの製作は、デバイスが有害な干渉を引き起こさない限り、ホビイストおよび実験用途の規定(例: FCC § 15.23)により一般的に許可されています。
- 規制要件は国によって異なります。米国以外の製作者は、各国の無線周波数管轄機関に適用される規則を確認してください。
本設計から構築されたデバイスが、当該管轄区域のすべての適用される無線周波数規制に準拠していることを確認するのは、製作者の全責任です。著者は本設計を個人的、教育的、およびホビー用途向けに提供しており、本設計から構築されたデバイスが商業配布の規制要件を満たすことを表明するものではありません。