picoZ80 ユーザーマニュアル

picoZ80 ユーザーマニュアル

picoZ80 は、DIP-40 ソケット付きの任意のコンピューターにおける Z80 CPU のドロップイン交換品です。ビンテージコンピューターの Z80 ソケットに直接装着するだけで — ホストボードに一切改造を加えることなく — 拡張メモリ、仮想ペリフェラル、フロッピーおよび QuickDisk エミュレーション、ファイリングシステム、WiFi 経由のブラウザベース管理インターフェースを提供します。
このマニュアルでは、物理ボード、初期セットアップ、ホストマシンへの接続、ウェブインターフェースの使用方法を説明します。アーキテクチャの詳細、設定リファレンス、開発情報についてはpicoZ80 テクニカルガイドを参照してください。

ボード概要

picoZ80 PCB は、標準的な 40 ピン DIP パッケージのフットプリント内に収まるように設計されています。40 本すべての DIP ピンがボードの裏面から突き出ており、実際の Z80 のピン配置と完全に一致しているため、ピンを曲げたりアダプターを使用したりすることなく、どの Z80 ソケットにも直接装着できます。
ボードの表面にはすべてのアクティブコンポーネントが搭載されています。ボードはほとんどの Z80 コンピューターの内部クリアランスよりも幅が狭く、ソケット上の高さは下に DIP-40 ソケットが取り付けられた標準的な IC のエンベロープ内に収まっています。

コネクタとインジケータ

picoZ80 ボードには以下のコネクタとインジケータがあります:
項目 説明
6 ピンデバッグヘッダー ボードの端に位置。RP2350 への SWD(シリアルワイヤデバッグ)アクセス、初期フラッシュ用の BOOTSEL とリセットライン、ESP32 のリセットを提供。下記のデバッグヘッダーのピン配置を参照。
USB ポート(Mini-B) USB 大容量ストレージ経由のファームウェアフラッシュ(初期フラッシュ)および ESP32 への USB-UART ブリッジ用の USB 接続。ボードリビジョン v2.3a 以降では ESP32 用の専用 USB ポートが追加で存在する場合もある。
SD カードスロット ESP32 が管理するフルサイズ SD カードスロット。config.json、ROM イメージ、ディスクイメージ、ファイリングシステムツリーを保持。

デバッグヘッダーのピン配置

6 ピンヘッダーは初期プログラミングとソースレベルデバッグのためのプライマリハードウェアインターフェースです。ピンはボード端マーカーに最も近い端のピン 1 から番号が付けられています。
ピン シグナル 機能
1 SWCLK シリアルワイヤデバッグクロック(ARM SWD)
2 SWDIO シリアルワイヤデバッグデータ(ARM SWD)
3 Reset RP2350 RP2350 のアクティブロウリセット。ロウにプルして RP2350 をリセット。
4 Reset ESP32 ESP32 のアクティブロウリセット。ロウにプルして ESP32 をリセット状態で保持。
5 GND グランド基準
6 BOOTSEL RP2350 ブートモード選択。電源投入/リセット中にロウを保持して USB 大容量ストレージモードに入る。

注:ピン 1、2、5 は SWD デバッグに使用(SWCLK、SWDIO、GND)。ピン 3 と 6 は初期フラッシュにのみ使用。ピン 4 は RP2350 の起動中に ESP32 が起動しないようにする必要がある場合に使用(例:初期 ESP32 ファームウェアプログラミング中)。


はじめに

picoZ80 ボードを初めてセットアップする際は、以下の手順を順番に実行します:
  1. USB 大容量ストレージモード(BOOTSEL)経由で RP2350 ブートローダーをフラッシュする。
  2. esptool 経由で ESP32 ファームウェアをフラッシュする。
  3. config.json と必要な ROM/ディスクイメージを含む SD カードを準備する。
  4. ホストコンピューターの Z80 ソケットに picoZ80 を取り付ける。
  5. 電源を入れ、picoZ80 ウェブインターフェースに接続し、必要に応じて設定する。

ステップ 1 — RP2350 ブートローダーをフラッシュする

RP2350 には物理的な BOOTSEL またはリセットボタンがありません。両方のシグナルは 6 ピンデバッグヘッダーで利用可能です。USB 大容量ストレージブートローダーに入るには:
  1. まだ picoZ80 をホストコンピューターに挿入しないでください — USB ケーブルでのみ PC に接続してください。
  2. ジャンパーまたはプローブを使用してピン 6(BOOTSEL)をロウに保持します。
  3. USB ポートに電源を供給します — RP2350 が起動を開始します。
  4. ボードが USB 大容量ストレージデバイスとして列挙された直後に BOOTSEL を解放します(リセット後に BOOTSEL を長く保持しすぎると RP2350 がフラッシュチップにアクセスできなくなります)。
  5. PC に RPI-RP2(または類似)とラベル付けされたドライブがマウントされます。
  6. Bootloader_<version>.uf2 をマウントされたドライブにコピーします。RP2350 は自己フラッシュして自動的に再起動します。
ブートローダーをフラッシュした後、その後のすべての RP2350 ファームウェアアップデートはウェブ OTA ページ経由でワイヤレスで実行できます — 通常のファームウェアアップデートのためにデバッグヘッダーに再度触れる必要はありません。

ステップ 2 — ESP32 ファームウェアをフラッシュする

ESP32 ファームウェアは esptool を使用してフラッシュします。ボードリビジョン v2.3a 以降では、ESP32 は独自の USB ポートを持ちホスト PC 上で独立して表示されます。以前のリビジョン(v2.0〜v2.2)では、ESP32 は USB-UART ブリッジとして機能する RP2350 を通じてアクセスされます。
Python 環境をセットアップします(一度だけ):
python3 -m venv ./venv/
source ./venv/bin/activate
cd $HOME/esptool
次に 4 つすべての ESP32 ファームウェアコンポーネントをフラッシュします。OS が割り当てたデバイスノードに PORT を調整してください:
PORT=/dev/ttyUSB0       # Linux — 必要に応じて調整
# PORT=/dev/tty.usbmodem141403  # macOS

BINPATH=/path/to/esp32/build

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 ファームウェアアップデートは OTA ウェブページ(ota-esp32.htm)経由で実行できます。

ステップ 3 — SD カードを準備する

SD カードは picoZ80 のプライマリストレージメディアです。設定ファイル、ROM イメージ、ディスクイメージ、ファイリングシステムディレクトリを保持します。
フォーマット要件:
  • FAT32 ファイルシステム。
  • FAT32 がサポートする任意の容量(信頼性の高いフォーマットには通常 32GB 以下を推奨)。
最低限必要なファイル:
  • SD カードのルートにある config.json — メイン設定ファイル。最小限の例については基本設定を参照。
  • webfs/ ディレクトリ — ESP32 ウェブインターフェースのアセット。プロジェクトリポジトリの webfs/ ディレクトリの内容を SD カードのルートにコピーしてください。
オプションだが推奨されるディレクトリ:
ディレクトリ 内容
MZF/ ファイリングシステム経由で読み込む MZF 形式プログラムファイル
ROM/ config.json が参照する ROM イメージ
DSK/ WD1773 エミュレーション用フロッピーディスクイメージ(DSK 形式)
QD/ QuickDisk エミュレーション用 QuickDisk イメージ
TZFS/ TranZPUter ファイリングシステムツリー
RFS/ ROM ファイリングシステムプログラムツリー
picoZ80 が動作したら、SD カードはウェブファイルマネージャーを通じて完全に管理できます — カードを物理的に取り外すことなく、ブラウザから ROM イメージのアップロード、config.json の編集、ディレクトリの作成が可能です。

ステップ 4 — ホストコンピューターに取り付ける

安全第一:picoZ80 を取り付けまたは取り外す前に、必ずホストコンピューターの電源を切ってプラグを抜いてください。ボードは内部で 3.3V で動作します。DIP-40 ピンは適切なインターフェース回路を通じて 5V ホストバスに接続されていますが、ボードは電源が入っている状態で挿入または取り外してはいけません。
取り付け手順:
  1. ホストコンピューターの電源を切り、静電気を放電します。
  2. DIP-40 ソケットから既存の Z80 CPU チップを取り外します。ピンを曲げないようにチップエクストラクターツールの使用を推奨します。
  3. picoZ80 の SD カードスロットに SD カードを挿入します。
  4. picoZ80 を Z80 ソケットに位置合わせし、picoZ80 のピン 1(ドットまたはノッチで示されている)がソケットのピン 1(こちらも示されており、通常は IC アウトラインシルクスクリーンのノッチに隣接)と一致することを確認します。
  5. picoZ80 をソケットに静かに均等に押し込みます。40 本すべてのピンが装着されていることを確認してください。無理に押し込まないでください — 抵抗を感じたら取り外してピンの位置を確認してください。
  6. ホストコンピューターの電源を入れます。
新しいファームウェアのインストール後の初回電源投入時、ESP32 はアクセスポイントモードで起動し、picoZ80 という名前の WiFi ネットワークをブロードキャストします。このネットワークに接続してウェブインターフェースにアクセスし、初期 WiFi 設定を完了してください。

注:picoZ80 は Z80 ソケットの VCC ピンの 5V 供給から電源を取ります。オンボードのバックコンバーターがすべてのボードコンポーネントに 3.3V を供給します。ホストコンピューターの 5V 供給が少なくとも 500mA を供給できることを確認してください — picoZ80 はピーク負荷(WiFi アクティブで RP2350 が 300MHz)で最大 400mA を消費する可能性があります。


WiFi セットアップ

WiFi 接続には、PCB 上のアンテナ整合回路の実装と、WiFi を有効にしてビルドされた ESP32 ファームウェアが必要です。下記の無線規制に関する注意事項を参照してください。NCM のみのファームウェアを使用している場合は、このセクションをスキップし、代わりに USB NCM 接続をご使用ください。
picoZ80 ESP32 コプロセッサが WiFi 接続を提供します。初回起動時(または WiFi 資格情報が保存されていない場合)、ESP32 はアクセスポイント(AP)モードで起動するため、ブラウザを備えた任意のデバイスから接続してホームネットワーク設定を構成できます。

アクセスポイントモードでの接続

  1. スマートフォン、タブレット、またはノートパソコンで WiFi 設定を開き、picoZ80 という名前のネットワーク(または AP モード時に config.jsonesp32.wifi.ssid フィールドで設定されたもの)を探します。
  2. picoZ80 ネットワークに接続します。デフォルトの AP パスワードは pZ80pZ80 です(変更されている場合はファームウェアのリリースノートを確認してください)。
  3. ブラウザを開いて http://192.168.4.1 に移動します — これはデフォルトの AP モード IP アドレスです。picoZ80 ウェブインターフェースが表示されます。
  4. WiFi マネージャーページに移動して、ホームネットワークの SSID とパスワードを入力します。
  5. Save & Connect をクリックします。ESP32 が再起動してホームネットワークにクライアントとして接続します。

クライアント(ステーション)モード

クライアントモードに設定されると、ESP32 はホーム WiFi ネットワークに参加し、ダッシュボードページに表示された IP アドレスで到達可能になります。config.json に固定 IP を設定した場合(アクセスの容易さのために推奨)、直接以下に移動してください:
http://192.168.1.192
設定した IP アドレスに置き換えてください。DHCP を使用している場合は、ルーターの DHCP クライアントリストから割り当てられたアドレスを確認してください。
ウェブインターフェースはブラウザで完全に動作します。追加のソフトウェアは不要です。picoZ80 ウェブサーバーはポート 80 で動作します。

USB NCM 接続(WiFi 不要)
ボードが NCM ファームウェア(sdkconfig.mode_ncm_only または sdkconfig.mode_wifi_and_ncm)でビルドされている場合、ESP32 USB ポートをホストコンピューターに接続すると仮想 Ethernet アダプターが表示されます。picoZ80 の内蔵 DHCP サーバーがホストに自動的に IP アドレスを割り当てるため、手動のネットワーク設定は不要です。
  1. ホストコンピューターから picoZ80 の ESP32 USB ポートに USB ケーブルを接続します。
  2. ホスト OS が新しいネットワークアダプターを検出するまで数秒待ちます。
  3. ウェブブラウザを開いて http://192.168.7.1 にアクセスします。
  4. picoZ80 ダッシュボードページが表示されます。
このモードでは、設定の編集、ファームウェア更新、ファイル管理、ペルソナ選択など、すべてのウェブインターフェース機能に完全にアクセスできます。WiFi アンテナや無線部品は不要です。

ウェブインターフェース

picoZ80 ウェブインターフェースは ESP32 が提供する 8 ページの Bootstrap 4 アプリケーションです。新しい GUI 設定エディタを含むすべてのページは、各ページ上部のナビゲーションバーからアクセスできます。ウェブアセットは SD カードの webfs/ ディレクトリに保存されており、ファームウェアとは独立して更新できます。

ダッシュボード(index.htm)

ダッシュボードはウェブインターフェースのホームページです。リアルタイムのシステム情報を表示し、picoZ80 の状態の概要を提供します。
ダッシュボードに表示される情報:
  • ファームウェアバージョン — 現在動作している RP2350 ファームウェアのバージョンとビルド日付。
  • ESP32 バージョン — ESP32 コプロセッサのファームウェアバージョン。
  • アクティブパーティション — 2 つのファームウェアスロット(1 または 2)のうち現在アクティブなもの。
  • アクティブペルソナ — 現在読み込まれているマシンペルソナ(例:MZ-700、MZ-80A)。
  • RP2350 クロック — MHz 単位の現在の CPU 周波数。
  • PSRAM クロック — 現在の PSRAM SPI クロック周波数。
  • WiFi ステータス / ネットワークステータス — WiFi モードでは、モード(AP またはクライアント)、SSID、割り当てられた IP アドレスを表示。NCM のみモードでは、このパネルは ネットワーク設定 と題され、USB NCM ネットワークの状態(IP アドレス、ネットマスク)を表示します — WiFi 関連のフィールドはありません。
  • WiFi RSSI(WiFi モードのみ) — 3 秒ごとに自動更新されるライブの受信信号強度インジケーター(dBm)。色分け表示:緑(−50 dBm 以上、優良)、青(−70 dBm 以上、良好)、オレンジ(−80 dBm 以上、普通)、赤(−80 dBm 未満、弱い)。NCM のみモードでは非表示。
  • WiFi TX Power(WiFi モードのみ) — 現在の送信電力(dBm)。こちらもライブ更新されます。NCM のみモードでは非表示。
  • SD カード — SD カードが存在するかどうかとファイルシステムのマウント状態。
  • アップタイム — 最終再起動からの経過時間。
ダッシュボードには RP2350 を再起動するボタンと、完全な再起動なしで SD カードから設定を再読み込みするボタンもあります。
すべてのページで右上のナビバーに 2 つのドロップダウンメニューが利用できます:
  • アクションメニュー
    - フロッピーディスク 1 / 2 の変更 — SD カードから新しい DSK イメージファイルを選択し、再起動なしで仮想 WD1773 フロッピーコントローラーのスロット 1 またはスロット 2 にマウントします。現在読み込まれているディスクイメージのファイル名が各エントリの横に表示されます(イメージが読み込まれていない場合は "none")。アクティブなフロッピーコントローラーが 2 台を超えるドライブをサポートする場合は、フロッピーディスク 3 および 4 の変更 も表示されます(それ以外の場合は非表示)。
    - QD ディスクの変更 — アクティブな QuickDisk イメージファイルをその場でスワップします。現在読み込まれている QD イメージのファイル名がエントリの横に表示されます。
    - RP2350 設定の再読み込み — ESP32–RP2350 UART 経由で RP2350 に再読み込みコマンドを送信します。RP2350 は config.json を再解析し、完全な電源サイクルなしにメモリマップとドライバー設定を再適用します。
  • 再起動メニュー
    - ESP32 — ESP32 コプロセッサをソフト再起動します(Web サーバーと WiFi スタックを再起動し、RP2350 には影響しません)。
    - RP2350B — RP2350 プロセッサをリセットします(ブートローダーを再実行してアクティブなファームウェアスロットを再読み込みし、リセット中はホスト CPU が一時停止されます)。
    - ホスト — ホストコンピューターのリセットラインをアサートし、picoZ80 ボード自体に影響を与えることなく Z80 ソケット内のレガシーコンピューターを再起動します。
    - IPL リセット — 8255 PPI ポート C ビット 3 をトグルして IPL(Initial Program Load)リセットを実行し、マシンをブートモード(BST)に戻します。MZ-80B、MZ-2000、MZ-2200、MZ-2500 ペルソナで使用可能 — オリジナルハードウェアの IPL ボタンを押すのと同等です。
    - RP2350 UF2 Boot / RP2350 UF2 Boot (App) — RP2350 を USB ブートローダー(BOOTSEL)に再起動し、マウントされたドライブにファームウェアの .uf2 をドラッグ&ドロップできるようにします。通常のバリアントは直接ブートローダーに入り、(App) バリアントは実行中のアプリケーションスロットから再び入ります。

コンフィグエディタ(config.htm)

コンフィグエディタページは、SD カードに保存されている config.json ファイルのブラウザ内エディタを提供します。エディタにはシンタックスハイライトと基本的な JSON バリデーションが含まれています。
設定を編集するには:
  1. コンフィグエディタページに移動します。
  2. 現在の config.json がエディタに自動的に読み込まれます。
  3. 変更を加えます。エディタはシンタックスエラーを赤でハイライトします。
  4. Save をクリックして更新されたファイルを SD カードに書き戻します。
  5. Apply(または再起動)をクリックして新しい設定を適用します。RP2350 は起動時に設定を読み取り、最小化してフラッシュに保存します — その後の起動では、SD カードがない場合はフラッシュのコピーを使用します。
メモリマップ、ROM イメージ、I/O マップへの変更は次の RP2350 リセット時に有効になります。esp32.wifi ブロックの WiFi 設定への変更は次の ESP32 再起動時に有効になります。

注:コンフィグエディタは SD カードのファイルを直接操作します。大幅な変更を加える前に、動作する config.json のバックアップコピーを PC に保存しておくことをお勧めします。

GUI 設定(configgui.htm)

GUI 設定ページは、生の JSON コンフィグエディタに対するグラフィカルな代替手段を提供します。すべての設定がラベル付き入力フィールド、ドロップダウンメニュー、編集可能なテーブルとして提示され、4 つのタブに整理されています:
  • RP2350 グローバル — 両パーティションに適用されるグローバルなコア電圧、CPU 周波数、PSRAM 周波数の設定。
  • パーティション 1 / パーティション 2 — パーティションごとのメモリマップ(アドレス、サイズ、タイプ、ウェイトステート、バンク、ROM ファイル)、I/O ポートマップ(アドレス、サイズ、タイプ、ハンドラー)、ドライバー設定(例:MZ80AFI、RFS、MZ-1E30、Celestite、PCW9512)。有効/無効トグル付きで、利用可能なすべてのインターフェースドライバーのフルセットを追加できる Add Driver ボタンを備えます。各セクションに行の追加・削除ボタンがあります。
GPIO バスチューニング。パーティションごとのコア設定では、3 つのバスグループ — AddressDataControl — ごとに独立して Z80 バスの電気特性を調整できます。各グループについて、ドライブ強度(2 / 4 / 8 / 12 mA)、スルーレート(slow = 低 EMI、または fast)、シュミットトリガー入力(オン / オフ)、プル抵抗(フロート / アップ / ダウン)を設定できます。オプションの ピンごとのオーバーライド テーブルにより、特定のホストマシンで必要な場合に、個々の GPIO ピンについてこれらのいずれかをオーバーライドできます。デフォルトは 2 mA ドライブ、スロースルー(最低 EMI)です。コア設定は Z80 リフレッシュ 値も公開します:0 は DRAM リフレッシュを無効にし、1 はオペコードフェッチごとにリフレッシュを発行し、NN フェッチごとに 1 回リフレッシュを発行します — リフレッシュ動作を周辺機器のタイミングとバランスさせることができます。
  • ESP32 — ESP32 デバイスタイプ、ネットワークインターフェース制御(WiFi Enable、NCM Enable、NCM Retries、NCM Retry Period)、WiFi 設定(SSID、パスワード、IP アドレス、ネットマスク、モード AP/Client、DHCP、TX パワー)。WiFi フィールドに加えて、USB の NCM IP アドレスネットマスク、およびカスタムの USB プロダクト名 を設定できます — 同じホストに接続された複数のボードを区別するのに便利です。
Save Configuration をクリックすると、変更が config.json に書き込まれ(以前のバージョンはバックアップされます)、RP2350 設定が自動的に再読み込みされます。Reload をクリックすると、SD カードから現在の config.json を再読み込みし、未保存の変更を破棄します。GUI で公開されている範囲を超える高度な編集には、コンフィグエディタを使用して生の JSON を直接変更してください。
ファイルブラウザ。ROM およびディスクイメージのフィールドには、SD カードのファイルピッカーを開く Browse ボタンがあり、パスを入力せずにファイルを選択できます。選択されたパスは SD カードのルートからの相対パスとして保存されます。
シリアルカードの port。MZ-8BIO3 および MZ-1E24 RS-232C シリアルインターフェースは port パラメータ — カードのベース I/O アドレス(デフォルト 0xB0) — を取り、ドライバー行で編集できます。
ドライバーシリーズと Base I/O Port。Add Driver ドロップダウンは、稼働中のファームウェアで有効なドライバーのみを提示します — ページはファームウェアが Sharp、Amstrad、Tatung、または Open(実験者向け)ビルドのいずれであるかを検出します。再配置可能なインターフェースカード(MZ-1R12、MZ-1R18、MZ-1R23、MZ-1R37、PIO-3034、MZ-8BIO3、MZ-1E24、MZ-1E05、Celestite)では、カード本来のベースが事前入力された単一の Base I/O Port フィールドが表示されます。picoZ80 を自作ボード上で使用する際にカードのポートを移動するにはこれを変更してください。GUI が正しいマッピングを自動的に書き込みます。各ドライバーは独自の System ROM イメージも読み込むことができ、ドライバーが有効なときにホストの ROM を上書きします。
デモモード。Web ページから機密フィールド — WiFi SSID とパスワード、および IP/ゲートウェイアドレス — を伏せるオプションのプレゼンテーション補助機能で、ネットワークの詳細を公開せずにスクリーンショットや画面録画でインターフェースを安全に見せることができます。

ファイルマネージャー(filemanager.htm)

ファイルマネージャーは SD カードの内容のブラウザベースビューを提供します。ディレクトリのナビゲート、新しいファイルのアップロード(ROM イメージ、ディスクイメージ、MZF プログラムファイル)、既存ファイルの PC へのダウンロード、新しいディレクトリの作成、ファイルとディレクトリの削除が可能です。
ファイルマネージャーの一般的なタスク:
  • ROM イメージのアップロードROM/ ディレクトリに移動し、アップロードボタンを使用して PC から ROM ファイルを転送。
  • ディスクイメージのアップロードDSK/(フロッピー)または QD/(QuickDisk)に移動してイメージファイルをアップロード。読み込み後、現在のディスクイメージファイル名がアクションメニューの各フロッピーおよび QD スロットの横に表示され、クイックリファレンスとして確認できます。
  • MZF プログラムのアップロードMZF/ または関連するファイリングシステムディレクトリに移動して MZF ファイルをアップロード。
  • config.json のバックアップconfig.json の横のダウンロードアイコンをクリックして PC にコピーを保存。
  • SD カードのバックアップBackup SD ボタンをクリックすると、SD カードの全内容を単一のアーカイブとしてローカルコンピューターにダウンロードします。picoZ80 がホストマシン内に設置されており、SD カードの物理的な取り外しが困難な場合に特に便利です。バックアップは設定ファイル、ROM イメージ、ディスクイメージ、ファイリングシステムデータのすべてを一度の操作で取得します。
ファイル操作は ESP32 経由で SD カードに直接実行されます。大きなファイルのアップロードはファイルサイズと WiFi 信号品質によっては数秒かかる場合があります。

ペルソナ選択(personality.htm)

ペルソナ選択ページでは、picoZ80 がホストコンピューターに提示するマシンペルソナ(ペルソナ)を選択できます。異なるペルソナは設定から異なるメモリマップ、ROM イメージ、仮想ドライバーバインディングを読み込みます。
現在サポートされているペルソナ:
  • MZ-700 — バンク切り替え、仮想ビデオ、キーボード I/O、WD1773 フロッピーエミュレーション、QuickDisk エミュレーション、ROM ファイリングシステムを備えたフル MZ-700 ペルソナ。CP/M v2.23(48K)、SA-1510 BASIC、Microsoft BASIC v4.7 を含み、いずれも SD カードの読み書きアクセスを持ちます。
  • MZ-80K — SP-1002 モニター、8255 PPI、8253 PIT、LS367 キーボードを備えた Sharp MZ-80K ペルソナ。2 つのフロッピーインターフェースが利用可能です:ネイティブの MZ80FIO(Toshiba T3444M) — オリジナルの MZ-80FD ディスクインターフェースで、すべての MZ-80K ディスク(ゲーム、アプリケーション、BASIC、CP/M)をブート・読み取りできます。そして MZ80AFI カード(MZ-80A FDC) — CP/M 用で、MZ-80K CP/M をブートでき、CP/M 内からオリジナルの MZ-80K CP/M ディスクをドライブ C:/D: として読み取れます。このペルソナはさらに他の MZ-80A インターフェースカード(RFS、MZ-1E14/E19、MZ-1R12/R18/R37、PIO-3034)をバインドできます。CP/M には仮想ペルソナモードが必要です。
  • MZ-80A — MZ-80A ペルソナ(開発中)。
  • MZ-80B — MZ-80B ペルソナ(開発中)。
  • MZ-800 — Sharp MZ-800 ペルソナ — MZ-700 互換モードとネイティブ MZ-800 モード(GDG による 320×200 / 640×200 グラフィック、4/16 色パレット)、SN76489 PSG サウンド、WD1773 フロッピーと QuickDisk を備えたデュアルモードマシン。モードをオンザフライで切り替えます。フル MZ-80A/MZ-700 インターフェースカードセットに加え、MZ-8BIO3 / MZ-1E24 RS-232C シリアルカードをバインドできます。
  • PCW-9512 — ゲートアレイ、uPD765 FDC、512KB ページド RAM、デイジーホイールプリンターコントローラーを備えた Amstrad PCW-9512 ペルソナ。
  • Basic CPU — マシン固有のドライバーを持たない、ソケット装着の素の Z80。単純なドロップイン置換や汎用的な Z80 開発向けです。
  • OpenZ80 — 自作ボードや未サポートのマシン向けの実験者向けペルソナ(その他のマシンを参照)。上記のペルソナとは異なり、これはこのページでの選択ではなく専用のファームウェアビルドです。ファームウェアアップデートページを使用して OpenZ80 ファームウェアをパーティションにフラッシュし、その後 GUI 設定ページでインターフェースカードを追加してそのベース I/O ポートを設定します。
ペルソナを切り替えると、ホストを再起動せずにアクティブなメモリマップと読み込まれた ROM イメージが変更されます。picoZ80 は新しいペルソナの設定に合わせてメモリバンキングを再初期化し、ホストは次の Z80 バストランザクション時に新しいメモリレイアウトを認識します。

ファームウェアアップデート(OTA)

RP2350 と ESP32 の両方のファームウェアは、デバッグヘッダーへの物理的なアクセスなしに、ウェブインターフェースから無線(OTA)でアップデートできます。

RP2350 OTA アップデート(ota-rp2350.htm)
  1. ビルドスクリプトを使用して RP2350 ファームウェアをビルドします — 出力バイナリはバージョンスタンプ付きのファイル名(例:BaseZ80_v3.009.bin)で fw/bin/ に入ります。
  2. http://<device-ip>/ota-rp2350.htm に移動します。
  3. どのパーティションスロットを更新するか選択します(スロット 1 またはスロット 2)。現在アクティブなスロットはダッシュボードに表示されます — アップデートが失敗した場合に既存のファームウェアを使用可能な状態に保つため、非アクティブスロットを更新することをお勧めします。2 つのオプションチェックボックスが利用可能です:Clear App Config はターゲットスロットの ROM イメージと設定データを消去し、Clear Flash Header はパーティションテーブルをファクトリーデフォルトにリセットします — 互換性のない設定スキーマを持つファームウェアバージョンにアップグレードする際に使用してください。
  4. Choose File をクリックし、.bin ファイルを選択して Upload をクリックします。
  5. アップロードと確認が完了するのを待ちます。ページに成功が確認され、新しいパーティションが利用可能として表示されます。
  6. 新しいファームウェアを有効化するには、同じページのパーティション選択セクションに移動し、新しく更新されたスロットを選択して Set Active & Reboot をクリックします。RP2350 が新しいファームウェアで再起動します。
アプリケーションパーティションは非標準のフラッシュアドレスに存在するため、純粋なバイナリ形式(UF2 ではなく)を使用します。ブートローダーは新しいパーティションを有効化する前にイメージのチェックサムを確認します — 確認に失敗した場合は既存のアクティブスロットが使用され続けます。

ESP32 OTA アップデート(ota-esp32.htm)
  1. ESP32 ファームウェアをビルドします — 出力バイナリは esp32/build/tzpuPico_esp32.bin です。
  2. http://<device-ip>/ota-esp32.htm に移動します。
  3. Choose File をクリックし、.bin ファイルを選択して Upload をクリックします。
  4. ESP32 は成功したアップロード後に自動的に新しいファームウェアで再起動します。
OTA ページは、SD カードの webfs/ ディレクトリに保存されたウェブインターフェースアセットを更新する FilePack アーカイブも受け付けます。これにより、ESP32 ファームウェアバイナリとは独立してウェブ UI を更新できます。

WiFi マネージャー(wifimanager.htm)

注:WiFi マネージャーページは、ESP32 ファームウェアが WiFi を有効にしてビルドされている場合(sdkconfig.mode_wifi_only または sdkconfig.mode_wifi_and_ncm)にのみ利用できます。NCM のみモードではこのページは存在しません — USB NCM 経由でネットワーク接続が自動的に提供されるため、ユーザー設定は不要です。
WiFi マネージャーページでは、ESP32 のワイヤレスネットワーク設定を構成します。ここで行われた変更は ESP32 の NVS(不揮発性ストレージ)に保存され、次の再起動時に有効になります。
利用可能な設定:
  • WiFi モードアクセスポイント(picoZ80 が独自のネットワークを作成する)またはクライアント(picoZ80 が既存のネットワークに参加する)。
  • SSID — 作成する(AP モード)または参加する(クライアントモード)ネットワーク名。
  • パスワード — WiFi パスフレーズ。
  • IP アドレス / ネットマスク / ゲートウェイ — クライアントモード用の固定 IP 設定(一貫したアクセスのために推奨)。
  • DHCP — ルーターからアドレスを自動的に取得するには有効にする;上記の固定 IP 設定を使用するには無効にする。
  • TX Power — WiFi 送信電力(0.25 dBm 単位、範囲 8〜84、すなわち 2〜21 dBm)。0 に設定するとリージョン固有のデフォルト値を使用します。picoZ80 PCB は最小限の RF 放射を目指して設計されているため、金属製コンピューターケース内に設置するとルーターへの信号が弱くなる場合があります。TX Power を上げると、わずかに高い消費電力と引き換えに接続性が向上します。下げると、多数の WiFi デバイスがある環境での干渉を低減できます。現在の RSSI と実効 TX Power はダッシュボードおよびこのページで 3 秒ごとにライブ更新されます。
保存後、Reboot ESP32 をクリックして新しい設定を適用します。ESP32 が再起動して新しい設定で接続します。クライアントモードの接続に失敗した場合(SSID またはパスワードが間違っている場合)、ESP32 はタイムアウト後にアクセスポイントモードにフォールバックし、再接続して設定を修正できるようになります。

基本設定

すべての picoZ80 の動作は SD カードの config.json で制御されます。以下は Sharp MZ-700 の最小限の動作設定です。すべてのオプションの詳細な説明についてはテクニカルガイド — 設定リファレンスを参照してください。
{
  "esp32": {
    "core": {
      "device": "Z80",
      "mode":   0
    },
    "wifi": {
      "override":  1,
      "wifimode":  "client",
      "ssid":      "YourNetwork",
      "password":  "YourPassword",
      "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": [
          {
            "enable":   1,
            "addr":     "0x0000",
            "size":     "0x1000",
            "type":     "ROM",
            "bank":     0,
            "tcycwait": 0,
            "tcycsync": 0,
            "task":     "",
            "file":     "/ROM/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":     "0x3000",
            "type":     "PHYSICAL_VRAM",
            "bank":     0,
            "tcycwait": 2,
            "tcycsync": 1,
            "task":     "",
            "file":     "",
            "fileofs":  0
          }
        ],
        "io":      [],
        "drivers": []
      }
    ]
  }
}
この例は以下をマッピングします:
  • 0x0000 – 0x0FFF — SD カードの /ROM/mz700.rom から PSRAM バンク 0 に読み込まれた 4KB ROM。
  • 0x1000 – 0xCFFF — PSRAM バンク 0 の 48KB RAM(読み書き、ゼロウェイトステート)。
  • 0xD000 – 0xFFFF — 物理ホストハードウェア(VRAM および I/O レジスタ)にパススルーされる 12KB。2 ウェイトステートと T1 同期を有効化。

ネットワークファイルサーバーのセットアップ

picoZ80 は Sharp MZ BASIC の NETx: デバイスプレフィックスを使用して、ネットワーク経由で BASIC プログラムのロード、セーブ、一覧表示が可能です。これには 3 つのコンポーネントが必要です:Celestite 仮想インターフェース(ペルソナの JSON に設定)、PC と同じネットワークに接続された picoZ80(WiFi または USB NCM 経由)、PC 上で動作する netfs.py Python ファイルサーバー。

前提条件
  • PC に Python 3.6 以降がインストールされていること。
  • picoZ80 ペルソナの config.json ドライバー設定に Celestite インターフェースが含まれていること。
  • Celestite インターフェースの config.json に、ip パラメータで PC の IP アドレスと netfs.py ポートが設定されていること。
  • picoZ80 と PC が同じネットワーク上にあること(WiFi クライアントモードまたは USB NCM)。
  • 提供する MZF プログラムファイルを含む PC 上のディレクトリ。

ファイルサーバーの起動
ファイルサーバーは picoZ80 リポジトリの tools/NetFileServer/netfs.py にあります。ターミナルから起動します:
# カレントディレクトリのファイルをデフォルトポート 6800 で提供:
python3 netfs.py --dir ./mzf_files

# カスタムポートと複数のユニットディレクトリで提供:
python3 netfs.py --port 6800 --dir ./games --dir2 ./utilities --dir3 ./basic_programs

# 各 --dirN は BASIC の NETx: にマッピング(--dir = NET1:、--dir2 = NET2: など)
サーバーはユニット 1〜7(NET1:NET7:)をサポートし、各ユニットを PC 上の別々のディレクトリにマッピングします。ポート 6800(--port で変更可能)で TCP 接続をリスンします。サーバーはマルチスレッドで、MZF ヘッダー解析を自動的に処理します。
対応ファイル形式:.mzf.mzt.m12(128 バイトヘッダー付き Sharp MZ テープ形式)、およびバイナリファイル(.bin.rom.dat)。

BASIC での NETx: の使用
PC 上でファイルサーバーが実行中であれば、BASIC コマンドで NETx: デバイスプレフィックスを使用します。picoZ80 の Celestite W5100 ドライバーが PC に自動的に接続します:
DIR NET1:                  ネットワークユニット 1 のファイル一覧(PC ディレクトリ)
LOAD "NET1:MYPROG"         PC からプログラムをロード
SAVE "NET1:MYPROG"         PC にプログラムをセーブ
LOAD "NET3:GAME"           ユニット 3 からロード(--dir3 にマッピング)
トラブルシューティング:接続に失敗する場合は、picoZ80 の IP アドレスが PC に到達可能であることを確認し(ダッシュボードのステータスページで割り当て済み IP を確認)、ファイアウォールがポート 6800 をブロックしていないことを確認し、ファイルサーバーが実行中であることを確認してください。サーバーはクライアントが接続するとターミナルに接続情報を出力します。

仮想カセット(CMT)ユニット

仮想カセット(CMT)ユニットは、Sharp MZ シリーズ向けの波形レベルのカセットデッキです。高速な経路である SD カードローディングとは異なり、CMT は本物志向の経路です。ローダーを近道せずにカセットの波形そのものを再現するため、ホストマシンから見れば実機のテープデッキと区別がつきません。モニターの LOAD、BASIC、カスタムローダーやターボローダー、そして SAVE のいずれも、物理レコーダーとまったく同じように動作します。任意の .mzf ファイルを「本物のカセットのように」ロードしたり、実行中のプログラムを新しい .mzf に記録したりできます。
CMT はホストマシンに自動的に適応します。シンプルファミリー(MZ-80K、MZ-80A、MZ-700、MZ-800)では、デッキはマシンのモーター オン/オフ ラインで駆動され、1200 ボーの単純なリニアテープとして動作します。コンピューター制御ファミリー(MZ-80B、MZ-2000、MZ-2200、MZ-2500)では、ホストがトランスポートを直接制御でき(PLAY、STOP、早送り、巻き戻し、イジェクト、および APSS プログラムサーチ)、2000 ボーで動作します。ファミリーを選択する必要はありません — アクティブなペルソナから推測されます。

CMT インターフェースの有効化
CMT はインターフェースドライバーであり、デフォルトではオフです。config.jsonCMT インターフェースブロックで "enable": 1 を設定するか、Web GUI の設定ページから追加して有効化することで有効にできます。CMT インターフェースが有効になると、テープを構築するための新しい CMT パネルが Web GUI に表示され、アクションメニューに CMT: Virtual / Real 項目が表示されます。

テープキューの構築
仮想テープは、最大 16 個の MZF ファイルからなる順序付きのキューです — 物理カセット上に次々と並ぶプログラムに相当します。Web GUI の CMT パネルからキューをライブで構築・編集できます。SD カードからファイルを追加し、エントリを削除し、あるいはエントリを並べ替えて再生順序を変更します。変更はリブートなしで即座に反映されます。
各プログラムの終わりでテープは次のエントリへ自動的に進み、実機のテープが次の録音へと走り続けるのとまったく同じように動作します。したがって次の LOAD は、手動操作なしにキュー内の次のプログラムを自動的に見つけます。

プログラムのロード
仮想テープからのロードは、実機のデッキからロードするのとまったく同じように行えます — CMT 固有の入力は何もありません。モニターの LOAD コマンドを使うか、BASIC からロードするか、任意のカスタムローダーやターボローダーを実行します。いずれもキューの先頭にある現在のプログラムを読み込み、その後キューは次のロードに備えて自動的に進みます。

トランスポートの動作
デッキの応答方法はホストファミリーによって異なります:
  • シンプルファミリー(MZ-80K / MZ-80A / MZ-700 / MZ-800) — マシンにはモーター オン/オフラインしかないため、モーターが通電している間テープが走るだけで、オリジナルのデッキとまったく同じです。ホスト駆動のトランスポート制御はありません。
  • 制御ファミリー(MZ-80B / MZ-2000 / MZ-2200 / MZ-2500) — マシンはトランスポートを直接制御できます:PLAYSTOP早送り巻き戻し(プログラム単位でスキップ)、EJECT、および APSS プログラムサーチ(次または前のプログラム境界までシークして自動的に停止)。

記録(SAVE)
保存も動作します。ホストがデッキを記録モード(モーター オン、記録)にして SAVE を発行すると、CMT は送出される波形をキャプチャしてデコードし、そのチェックサムを検証して、SD カード上の CMT/ ディレクトリに新しい MZF ファイルを書き込みます。ファイル名は次のとおりです:
CMT/taperecord_<name>_<YYYYMMDD_HHMMSS>.mzf
ここで <name> はプログラム自身の Sharp ファイル名です(ASCII に変換され、正当な FAT ファイル名になるようサニタイズされます — 不正な文字はすべて _ になります)。ESP32 のクロックが設定されていない場合は、タイムスタンプの代わりにシーケンス番号が使用され(例:taperecord_<name>_0001.mzf)、デフォルトの 1980 年の日付で記録が衝突することはありません。オリジナルの Sharp 名は MZF ヘッダー自体に格納されるため、再ロードするとプログラムは本来の名前を保持します。

Real / Virtual トグル
CMT インターフェースが有効な場合、アクションメニューに CMT: Virtual / Real 項目が表示され、仮想テープと物理的に接続されたレコーダーとの間でデッキを、リブートなしにライブで切り替えます:
  • Virtual — 仮想カセットがホストの読み取り内容を供給し、物理的に接続されたデッキへのモーター/トランスポートコマンドは抑制されます。これは .mzf ファイルのロードと記録のための通常モードです。
  • Real — 実機のカセットデッキへの純粋なパススルー:モーターが物理レコーダーを駆動し、CMT は聴くだけです。
このトグルは、メディア間でプログラムを転送するのに便利です — 例えば、仮想テープからプログラムをロードし、Real に切り替えて物理カセットに SAVE する、あるいはその逆を行えます。

チップを追加する — 仮想ペリフェラルデバイス

picoZ80 は、もともと搭載されていなかったサポートチップをマシンに追加できます。Z80 DMA コントローラー、カウンター / タイマー、パラレルポート、フロッピーコントローラー — いずれも実際の集積回路を忠実にモデル化したもので、どのマシンにも組み込んで Web インターフェースから配線できます。はんだ付けもファームウェアの記述も不要です。チップは設定に記述され、マシンの起動時に構築されます。
これは、設計をハードウェアに起こす前に実験したり、オリジナルのマシンに欠けていたペリフェラルを追加したり、あるいは picoZ80 上でまったく新しい自作の Z80 コンピューターを構築したりするための仕組みです。利用できるチップは以下のとおりで、テクニカルガイドにはそれぞれのすべてのピンが記載されています。
チップ 用途
ダイレクトメモリアクセス(DMA) プロセッサーを介さずにメモリと I/O の間でデータブロックを転送します。特定のバイト値を検索することもできます。
カウンター / タイマー(CTC) 4 つの独立したタイマーまたはイベントカウンター。周期割り込みやボーレートの生成に使用します。
パラレル入出力(PIO) ハンドシェイク付きの 8 ビットポート 2 組。プリンター、キーボード、汎用の制御ラインに使用します。
インターバルタイマー(8253 / 8254) 6 つのカウントモードを持つ 3 つのカウンター。タイミング、音の生成、割り込みに使用します。
パラレルインターフェース(8255) 方向をプログラムできる 8 ビットポート 3 組。
フロッピーディスクコントローラー(WD1773) SD カード上のフロッピーディスクイメージを読み書きします。
シグナルポート 8 本の配線を 1 つのアドレスに割り当てるテスト用ポート。プログラムから直接駆動・読み取りできます。

チップを追加する
Web インターフェースを開き、左側のメニューから設定(Config)、続いて GUI を選択します。設定ページは 4 つのタブで開きます。チップを組み込みたいパーティション — Partition 1 または Partition 2 — を選択してください。Core Settings、Memory、I/O、Drivers を通り過ぎてスクロールすると、デバイス(Devices)接続(Connections)の 2 つのパネルがあります。
Devices パネルの見出しをクリックして開き、デバイスの追加(Add Device)を押します。利用可能なチップの一覧が、それぞれの機能の簡単な説明とともに表示されます。使いたいものをクリックすると即座に追加されます — 記入すべきダイアログはありません。
チップはすぐに動作する状態で追加されます。picoZ80 が空きアドレスと名前を与え、すべての入力を接続し、割り込みラインをプロセッサーに接続し、割り込み優先度チェーンに配置します。カウンター / タイマーを追加して何も変更せずに保存するだけで、動作するタイマーを搭載した状態でマシンが起動します。これは意図的な設計です — 配線が中途半端なチップは「何も起きない設計」を生む最もありがちな原因なので、インターフェースはそもそもそうしたものを作らせません。

チップの設定項目
各チップは 1 行を占めます。通常触ることになる設定項目は次のとおりです:
  • En — チェックするとチップが組み込まれ、外すと作業内容を消さずに除外できます。
  • Device — どのチップかを示します。マウスを重ねると機能の説明が表示されます。
  • Name — このチップを他のチップに配線するときに使う名前です。短く覚えやすいものを選んでください。デフォルトは ctc0dma0 です。
  • Space — チップを I/O マップとメモリマップのどちらに置くか。ほとんどの場合は I/O です。
  • Address — チップが応答する先頭アドレス。ボックスがピンク色になった場合は、そのアドレスが他のチップと衝突しています。別のアドレスを選んでください。
  • Size — 使用するアドレスの個数。理由がない限り picoZ80 が選んだ値のままにしておいてください。
詳細設定(Advanced)ボタンを押すと、DMA コントローラーにのみ適用される 2 つの設定が現れます — バスを取得したことを通知するかどうかと、プロセッサーにバスを返すまでに転送してよい最大バイト数です。デフォルトは妥当な値なので、変更する理由ができるまではそのままにしておくのが最善です。
配線した後にチップの名前を変更しないでください。接続はチップを名前で参照しており、名前の変更に追従しないため、接続が「見つからない」状態として表示されます。別の名前にしたい場合は、チップを削除してから追加し直してください。

チップ同士を配線する
Connections パネルがワイヤーハーネスにあたります。各行が 1 本の配線で、何かが何かを駆動することを表します。接続の追加(Add Connection)を押すと新しい配線が作られます。
配線の出どころをソース(Source)のリストで、行き先を接続先(Destination)のリストで選びます。どちらのリストも平易な言葉で書かれており、ピン番号ではなく Counter / Timer (CTC) — Channel 0 output (time out)(カウンター / タイマー(CTC) — チャンネル 0 出力(タイムアウト))のような項目が並びます。出力はソースにしか現れず、入力は接続先にしか現れないため、誤って出力同士をつなぐことはできません。既に駆動されている入力はグレー表示され、(already connected)(接続済み)と記されます。実際の入力を駆動できるのは 1 つだけだからです。
作成できる接続には 3 種類あります。
  • 直接の配線 — ソースと接続先を選ぶだけで完了です。これは基板上のパターンで一方のチップと他方のチップをつなぐのと同等です。
  • 固定レベル — ソースとして Always on (1)(常にオン)または Always off (0)(常にオフ)を選びます。これはピンを電源ラインまたはグランドに結線するのと同等で、設計で使用しない入力に対して行う処置です。
  • 論理条件another input(もう 1 つの入力)をクリックして 2 つ目のソースを追加します。結合(Combine)ボックスが現れ、When both are on (AND)(両方がオンのとき)、When either is on (OR)(どちらかがオンのとき)、When not both are on (NAND)(両方がオンではないとき)、When neither is on (NOR)(どちらもオンでないとき)、When exactly one is on (XOR)(ちょうど一方だけがオンのとき)、When both or neither (XNOR)(両方またはどちらもオンでないとき)から選べます。これはチップの間に小さな論理ゲートを取り付けるのと同等です。
各ソースの横には反転(invert)のチェックボックスがあります。これをチェックするとその信号が反転するため、負論理の入力を期待するチップを、何も考えずに正論理の出力から駆動できます。Note 列は自分用のラベルであり、マシンの動作には影響しません。
未接続の入力が残っている場合は、Add Connection の横に黄色の注意書きが現れ、それらが一覧表示されます。これはエラーではありません — 未接続の入力は単に静止レベルを読み取るだけです — が、すべてを明示的に接続しておくと、設計が意図どおりであることを表現できます。

実例 — タイマーでゲートした DMA
転送がマシンを占有してしまわないよう、タイマーが許可している間だけデータを転送する DMA コントローラーを作りたいとします。手順は 3 つです:
  1. DevicesAdd Device を押し、Counter / Timer (CTC) を選びます。続いてもう一度押して Direct Memory Access (DMA) を選びます。これで両方のチップが組み込まれ、完全に接続された状態になります。
  2. ConnectionsAdd Connection を押します。SourceCounter / Timer (CTC) — Channel 0 output (time out) を設定し、another input をクリックして 2 つ目のソースに Channel 1 output (time out) を設定します。CombineWhen neither is on (NOR) を設定します。DestinationDirect Memory Access (DMA) — Transfer request from the peripheral を設定します。
  3. Save Configuration を押します。
これで DMA は、両方のタイマー出力が Low の間だけ転送を行います。転送に関するそれ以外のすべて — どこからどこへ、何バイト、転送なのか検索なのか — は、実際のチップとまったく同じように、Z80 上で動作するソフトウェアがプログラムします。

変更を保存する
ページ下部の設定の保存(Save Configuration)を押します。設定は SD カード上の config.json に書き込まれ、以前のファイルはバックアップとして保持されます。再読み込み(Reload)は編集内容を破棄して、カードからファイルを読み直します。
重要:保存してから数秒後に、新しいチップを構築するためエミュレートされたマシンが自動的に再起動します。そのとき Z80 上で動作していたものはすべて失われるので、先にエミュレートされたマシン側で作業内容を保存しておいてください。ページはこのことを警告しません。
注意点
  • パーティションごとに固有のチップを持ちます。Devices と Connections はパーティション単位で設定されるため、Partition 1 に組み込んだチップは Partition 2 には現れません。実際に動かすつもりのパーティションを設定するよう注意してください。
  • 保存すると設定ファイル全体が書き換えられます。コメントは削除され、アドレスは 10 進数で書き直されます。マシンの動作に影響はありませんが、丁寧に注釈を付けた config.json を保守している場合は、グラフィカルエディターを使う前に別の場所にコピーを取っておいてください。
  • アドレスが衝突していても保存は妨げられません。アドレスボックスはピンク色になりますが、保存は許可されます。保存する前にピンク色のボックスがないか確認してください。
  • 接続を追加するときは、リストに目的のものが既に表示されていても、必ず Destination を明示的に選択してください。
  • Add Device の一覧が空だったり、Config GUI のページ自体が存在しなかったりする場合は、SD カードに古い Web インターフェースが入っています。カード上のファイルパックを更新してください。
チップはコンフィグエディタ(Config Editor)を使って config.json に手書きで宣言することもできます。フロッピーコントローラーのディスクイメージやインターバルタイマーのクロック周波数など、あまり使われない一部の設定に到達する唯一の方法がこれです。フォーマットはテクニカルガイドに記載されています。

ドライバーとインターフェース

picoZ80 はモジュラードライバーアーキテクチャを採用しています。各ホストマシンは、メモリマップ、I/O ハンドラー、対応ペリフェラルを定義するペルソナドライバーとして実装されます。拡張ハードウェアは、ペルソナにプラグインするインターフェースドライバーとして実装されます。すべてのドライバーは SD カード上の config.json の JSON で設定されます。ペルソナドライバーは以下にメーカー別にグループ化されています。

Sharp MZ / X1 シリーズ

Sharp MZ および X1 シリーズマシンは picoZ80 プロジェクトの主要ターゲットです。各マシンモデルには、固有のペリフェラルセットをサポートする専用のペルソナドライバーがあります。

マシンペルソナドライバー
各ペルソナドライバーは完全な Sharp MZ コンピューターをエミュレートします。ペルソナはペルソナ選択 Web ページ、または config.json"drivers" 配列の "name" フィールドを編集して選択します。
ペルソナ ドライバー 説明
MZ-700 MZ700 Sharp MZ-700。バンク切替メモリ、VRAM、キーボード、8253 PIT。デフォルトペルソナ。
MZ-1500 MZ1500 MZ-700 スーパーセット。内蔵 Quick Disk、PCG、ステレオ PSG(SN76489AN)、Z80 PIO プリンター。
MZ-80K MZ80K Sharp MZ-80K。SP-1002 モニター、8253 PIT、8255 PPI、LS367 キーボード、ネイティブ MZ-80FD(T3444M)フロッピー、CP/M 用 MEMSW。MZ-80A インターフェースカードのフルセットを使用可能。CP/M には仮想モードが必要。
MZ-800 MZ800 Sharp MZ-800。デュアルモード(MZ-700 互換 + ネイティブ 320/640 幅 GDG グラフィック、4/16 色)、SN76489 PSG、WD1773 FDC + QuickDisk。MZ-700 ソフトウェアと CP/M を実行。
MZ-80A MZ80A Sharp MZ-80A。SA-1510 モニター、8253 PIT、8255 PPI、CP/M 用 MEMSW。
MZ-2000 MZ2000 Sharp MZ-2000。IPL ROM、BST/NST モード切替、VRAM オーバーレイ、MB8866 FDC。
MZ-2200 MZ2200 Sharp MZ-2200。同一アーキテクチャの MZ-2000 バリアント。
MZ-80B MZ80B Sharp MZ-80B。2K IPL ROM、BST/NST モード、デュアル GRPH ページのモノクロ、8253 PIT、8255 PPI、Z80 PIO。
MZ-2500 MZ2500 Sharp MZ-2500(SuperMZ)。8 ページ MMU、MZ-2000/MZ-80B 互換モード、YM2203 FM+PSG、G-CRTC、MB8876 FDC。仮想モードは割り込み駆動ソフトウェア、D88 ネイティブディスクフォーマット、ワンショット割り込み抑制をサポート。
X1 / X1 Turbo X1 Sharp X1 および X1 Turbo。物理モードで動作し、メモリ、ビデオ、キーボード、サブ CPU、サウンドは実機が提供します。内蔵 FDC 上の SD カードによる仮想フロッピードライブと、サンプルレベルの仮想カセットデッキを追加します。初回リリース。以下を参照してください。

Sharp X1 — 仮想フロッピードライブ
X1 ペルソナは最初のリリースであり、対象範囲を意図的に絞っています。picoZ80 は X1 そのものをエミュレートしません。メモリ、IPL および BIOS ROM、ビデオハードウェア、キーボードとサブ CPU、音源、内蔵のカウンター・シリアル・DMA の各チップは、いずれも実機が提供します。picoZ80 が追加するのは内蔵フロッピーディスクコントローラーで、これにより SD カード上のディスクイメージが X1 から実際のドライブとして見えるようになります。
エミュレートされるコントローラーは X1 に搭載されている MB8877A で、マシン自身の IPL が改造なしでそこからブートします。最大 4 ドライブに対応しますが、実際に使用できる台数は空きメモリに依存し、通常は 2 台か 3 台です — 何台が組み込まれたかは起動ログに報告されます。ディスクは 5.25 インチ、両面、1 トラックあたり 256 バイト × 16 セクターで、2D(40 トラック)または 2DD(80 トラック)フォーマットです。生セクターイメージ、.D88 イメージ、Extended CPC .DSK イメージのいずれも受け付け、フォーマットはファイル名ではなく内容から判別されます。書き込みは SD カード上のイメージファイルに保存されます。
イメージは Web インターフェースの Floppy メニューから通常どおりマウントでき、マシンの動作中に交換やイジェクトも行えます。FDD Unit: Virtual / Real トグルは MZ シリーズと同様に X1 でも機能し、Real に設定するとコントローラーのポートを X1 自身のハードウェアに返し、ロード済みのイメージは切り戻したときのために保持されます。
使用するには、ペルソナ選択ページで Sharp X1 / Turbo を選択します。両方のパーティションを X1 に設定する必要があります — 他のマシンと混在させる構成はまだ用意されていません。X1 は自身の ROM を使用するため、ROM ファイルは不要です。SD カードに dsk/X1/ ディレクトリを作成してディスクイメージを置いてください。ペルソナはデフォルトで drive0.2ddrive1.2d を想定していますが、その後は Web インターフェースから好きなイメージをマウントできます。

Sharp X1 — 仮想カセットデッキ
X1 には、MZ シリーズが使用するものとは別の独自の仮想カセットデッキがあります。これはサンプルレベルで動作します。X1 のテープイメージは .tap ファイルであり、構造化されたプログラムファイルではなくカセットの読み取りライン自体の記録で、1 サンプルが 1 ビットに対応します。picoZ80 は単にその記録をファイルが指定するレートでマシンの読み取りラインに送り出し、録音時には書き込みラインを同じ形式でサンプリングして戻すだけです。デコードも再エンコードも行わないため、どんなローダーも実際のテープとまったく同じように動作します。
これが、X1 のデッキが MZ のものとは別のエンジンである理由です。Sharp MZ のテープは .mzf ファイル — ヘッダーレコードと本体 — として格納されており、picoZ80 はこれを波形にエンコードする必要があります。X1 のテープは既に波形そのものです。2 つのフォーマットに互換性はありません。
テープファイルは 8 kHz でサンプリングされていることが多いですが、22.05、24、32、44.1、48 kHz のファイルもすべて受け付けられ、レートはファイルから読み取られます。標準の .tap レイアウトとヘッダーなしのバリアントの両方に対応しています。ファイルは数メガバイトに達することも多いため、再生はメモリに読み込むのではなく SD カードからストリーミングします — 長いテープでも RAM を消費しません。
このデッキは X1 自身のトランスポート制御に応答します。X1 は MZ シリーズのようにモーターラインをトグルするのではなく、サブ CPU を介してカセットに命令を送るからです。再生、停止、早送り、巻き戻し、イジェクト、録音のすべてがソフトウェアから動作し、APSS — 記録の間の空白まで前後に送る自動プログラムサーチ — も同様です。マシンはデッキのセンサーを読み取ることもできるため、カセットが入っているか、ライトプロテクトされているか、テープが終端まで走ったかを調べるソフトウェアにも妥当な答えが返ります。
テープは MZ シリーズと同じように Web インターフェースの CMT メニューからマウントします。.tap ファイルは SD カード上の CMT/X1/ ディレクトリに置いてください。ペルソナはデフォルトで tape0.tap を読み込みます。録音では新しい .tap ファイルがカードに書き戻されます。
X1 でまだ対応していないもの
  • フロッピーコントローラーとカセットデッキ以外のすべて。X1 のメモリ、ビデオ、グラフィック RAM、キーボード、サウンドのエミュレーションはありません — それらはすべて実機が提供します。完全仮想の X1 は今後のプロジェクトです。
  • Turbo 固有のハードウェア。汎用の X1 プロファイルが 1 つ提供されます。Turbo 独自の DMA コントローラー、2HD メディア、拡張フロッピー機能はモデル化されていません。

インターフェースドライバー
インターフェースドライバーは、ドライバーの JSON 設定の "if" 配列でペルソナに追加されます。各インターフェースは独立して有効/無効にでき、独自の ROM、ディスクイメージ、I/O 設定を持ちます。
インターフェース JSON 名 I/O ポート 説明
ROM ファイリングシステム RFS 0x51–0x53, 0xC1–0xC8, 0xEFF8–0xEFFF SD カードストレージ、CP/M ブート、ROM バンキングを備えた拡張モニター。
TranZPUter ファイリングシステム TZFS 0x60(メモリモード)、0x68(サービスプロセッサー) MZ-700 ペルソナ向けのマルチバンクモニター + CP/M ファイリングシステム(RFS と排他的)。CP/M をブート。ドライブイメージは param の file フィールドでドライブごとに設定。
フロッピーコントローラー(MZ-700) MZ-1E05 0xD8–0xDE WD1773 ベース FDC。最大 4 ドライブ。DSK/RAW/D88 イメージ。
フロッピーコントローラー(MZ-80K) MZ80FIO 0xF8–0xFB, 0xF000–0xF3FF Toshiba T3444M FDC を駆動するネイティブ MZ-80FD/MZ-80FIO インターフェース。128 バイト FM セクター、最大 4 ドライブ、CPC 拡張 DSK イメージ。
フロッピーコントローラー(MZ-80A) MZ80AFI 0xD8–0xDE, 0xF3FE–0xF3FF MZ-80A AFI。2 MHz 動作用の DRQ ベース A10 トグル。
フロッピーコントローラー(MZ-2000) MZ-8BFI または E0054PA 0xD8–0xDE ドライバー ROM なしの MB8866 FDC(コードは IPL 内)。D88 対応。
QuickDisk(ROM 付き) MZ-1E14 0xF4–0xF7 MZ-700/MZ-800 用 BIOS ROM 付き QD コントローラー。
QuickDisk(ROM なし) MZ-1E19 0xF4–0xF7 MZ-800/MZ-2000/MZ-2200/MZ-2500 用 QD コントローラー。
32KB バッテリー RAM MZ-1R12 0xF8–0xFA バッテリーバックアップ CMOS SRAM、SD カードに永続化。最大 2 インスタンス。
64KB RAM ボード MZ-1R18 0xEA–0xEB RAMFILE ディスクとして使用される RAM 拡張。
漢字 ROM MZ-1R23 0xB8–0xB9 128KB 漢字 ROM(16×16 JIS)+ オプションの 256KB 辞書 ROM。
640KB EMM MZ-1R37 0xAC–0xAD 20 ビットアドレス空間を持つ拡張メモリマネージャー。
320KB EMM PIO-3034 設定可能 自動インクリメントデータポート付き IO DATA EMM。
Celestite LAN Celestite 0x60–0x6F W5100 Ethernet、割り込みコントローラー、UFM、統合 MZ-1R12/MZ-1R37。JSON の ip パラメータで設定可能なサーバー IP。
SASI ハードディスク MZ-1E30 0xA4–0xA5, 0xA8–0xA9 MZ-1E30 SASI ハードディスクコントローラー(MZ-2500/MZ-80B)。最大 4 ディスク(各約 21.4 MB)。32KB IPL ROM。ディスクイメージは SD カード上。
RS-232C シリアル(BI) MZ-8BIO3 0xB0–0xB3(設定可能) デュアルチャンネル RS-232C カード(エミュレート Z80 SIO)。チャンネル A/B は USB CDC シリアルポート 2 および 3 にブリッジ。「BI」コネクター配線。
RS-232C シリアル(ST) MZ-1E24 0xB0–0xB3(設定可能) MZ-8BIO3 と同じですが、Sharp「ST」コネクター配線。

TZFS と CP/M(MZ-700 ペルソナ)
TZFS は、MZ-700 ペルソナ上の選択可能なインターフェースとして提供される低レベルモニター兼ファイリングシステムです(実際には RFS の代わりに使用します — どちらか一方を有効化してください)。モニターに加えて CP/M をブートして実行します。TZFS は MZ-700 構成に同梱されていますが、デフォルトではオフです。config.jsonTZFS インターフェースブロックで "enable": 1 を設定するか、Web GUI の設定ページからオンにして有効化します。その ROM(roms/tzfs.bin)が SD カード上に存在する必要があります。
CP/M ディスクイメージは、インターフェースの param 配列を通じてドライブごとに設定されます — 各 param[].file エントリは、そのドライブ用の SD カード上のイメージ全体ファイルのパスを指定します。ドライブに明示的な file エントリがない場合、フォールバックパステンプレート CPM/SDC16M/RAW/CPMDSK<nn>.RAW が使用されます。picoZ80 には直接の SD アクセスがないため、これらのセクターは ESP32 を介して読み書きされます。

TZFS からのフロッピーディスクのブート
TZFS v1.8.3 より、MZ-80A、MZ-700、MZ-800 ペルソナでフロッピーディスクのオペレーティングシステムを TZFS 内から直接ブートできます — MZ-800 CP/M を含みます。ブート可能なディスクイメージをフロッピーコントローラーに挿入し(アクション → フロッピーディスクの変更を参照)、TZFS モニターからブートします。TZFS はマシンのネイティブブート ROM とまったく同じようにディスク自身の IPL をロードして実行するため、ディスク BASIC、CP/M、その他のディスクベースのオペレーティングシステムが正常に起動します。
フロッピーからブートした OS が実行中に、ホストのハードウェア RESET スイッチを押すと、素のマシンモニターではなく TZFS に戻ります — TZFS は自身を復元してコールドブートするため、常に次のプログラムをロードする準備が整った見慣れたプロンプトに戻されます。

ペルソナとインターフェースの互換性
すべてのインターフェースドライバーがすべてのペルソナで利用できるわけではありません。下の表は、"if" 配列を通じて各マシンペルソナで使用できるインターフェースを示しています。
インターフェース MZ-700 MZ-1500 MZ-80K MZ-800 MZ-80A MZ-2000 MZ-2200 MZ-80B MZ-2500
RFS Yes Yes Yes Yes Yes Yes
TZFS Yes
MZ-1E05 Yes Yes Yes
MZ80FIO Yes Yes
MZ80AFI Yes Yes Yes
MZ-8BFI / E0054PA Yes Yes Yes Yes Yes
MZ-1E14 Yes Yes Yes Yes Yes Yes
MZ-1E19 Yes Yes Yes Yes Yes Yes Yes Yes
MZ-1R12 Yes Yes Yes Yes Yes Yes Yes Yes Yes
MZ-1R18 Yes Yes Yes Yes Yes Yes Yes Yes Yes
MZ-1R23 Yes Yes Yes Yes
MZ-1R37 Yes Yes Yes Yes Yes
PIO-3034 Yes Yes Yes Yes Yes
Celestite Yes Yes Yes Yes
MZ-1E30 Yes Yes
MZ-8BIO3 Yes Yes Yes Yes
MZ-1E24 Yes Yes Yes Yes

JSON 設定例
以下の例は、RFS、フロッピーコントローラー、QuickDisk ドライブを備えた MZ-700 ペルソナの設定方法を示します。これは config.json のパーティション z80 ブロック内の "drivers" 配列に配置します:
"drivers": [
  {
    "name": "MZ700",
    "enable": 1,
    "type": "VIRTUAL",
    "if": [
      {
        "name": "RFS",
        "type": "VIRTUAL",
        "enable": 1,
        "rom": [
          {
            "file": "roms/MROM_PICOZ80_256.bin",
            "enable": 1,
            "loadaddr": [
              { "enable": 1, "position": "0x0", "addr": "0x0",
                "bank": 32, "size": "0x80000", "tcycwait": 0, "tcycsync": 0 }
            ]
          },
          {
            "file": "roms/USER_ROM_PICOZ80_256.bin",
            "enable": 1,
            "loadaddr": [
              { "enable": 1, "position": "0x0", "addr": "0x0",
                "bank": 40, "size": "0x80000", "tcycwait": 0, "tcycsync": 0 }
            ]
          }
        ]
      },
      {
        "name": "MZ-1E05",
        "type": "VIRTUAL",
        "enable": 1,
        "param": [
          { "file": "dsk/MZ-2Z009-RFS.dsk", "enable": 1 }
        ]
      },
      {
        "name": "MZ-1E19",
        "type": "VIRTUAL",
        "enable": 1,
        "param": [
          { "file": "qd/BASIC_5Z008A_RFS.qd", "enable": 1 },
          { "file": "qd/BASIC_5Z008B.qd", "enable": 1 }
        ]
      },
      {
        "name": "Celestite",
        "type": "VIRTUAL",
        "enable": 1,
        "param": [
          { "file": "ram/celestite_r12.ram", "enable": 1 },
          { "file": "ram/celestite_r37.ram", "enable": 1 },
          { "ip": "192.168.1.210:6800", "enable": 1 }
        ]
      }
    ]
  }
]
ファイルサーバーアドレスの設定:config.json の Celestite インターフェースの param 配列に ip エントリを追加し、PC の IP アドレスと netfs.py ポートを指定します:
{ "ip": "192.168.1.210:6800", "enable": 1 }
MZ-1E30 SASI ハードディスクの設定:ペルソナの "if" 配列に MZ-1E30 インターフェースを追加します。rom エントリは 32KB IPL ROM を提供し、param エントリはハードディスクイメージ(最大 4)を指定します:
{
  "name": "MZ-1E30",
  "type": "VIRTUAL",
  "enable": 1,
  "rom": [{ "file": "roms/MZ-1E30.ROM", "enable": 1 }],
  "param": [
    { "file": "hdd/boot.hdd", "enable": 1 },
    { "file": "hdd/data.hdd", "enable": 1 }
  ]
}
主要 JSON フィールド:
  • name — ペルソナまたはインターフェース名(コンパイル済みドライバーと一致する必要あり)。
  • enable — 1 でアクティブ化、0 でスキップ。
  • type"VIRTUAL"(PSRAM でエミュレート)または "PHYSICAL"(実ハードウェアへのパススルー)。
  • rom — ロードする ROM イメージの配列。各エントリは file パス(SD カードルートからの相対パス)と、データの配置場所(Z80 アドレス、PSRAM バンク、サイズ)を指定する loadaddr 配列を持ちます。
  • param — ディスク/RAM イメージファイルの配列。param[0].file が最初のディスク、param[1].file が 2 番目など。
  • addrmap — オプションのアドレス再マッピング(ソース → デスティネーション)。
  • iomap — オプションの I/O ポート再マッピング。
すべてのファイルパスは SD カードルートディレクトリからの相対パスです(例:"roms/MROM_PICOZ80_256.bin")。

Amstrad PCW シリーズ

picoZ80 は Sharp MZ シリーズに加えて、Amstrad PCW-9512 と Tatung Einstein TC-01 をサポートしています。

マシンペルソナドライバー
各 Amstrad ペルソナドライバーは完全な Amstrad マシンをエミュレートします。ペルソナはペルソナ選択 Web ページ、または config.json"drivers" 配列の "name" フィールドを編集して選択します。
ペルソナ ドライバー 説明
PCW-9512 PCW9512 Amstrad PCW-9512。Z80A @ 4MHz、4 バンク 16KB ページ切替(ポート F0-F3)付き 512KB RAM、ビデオ/システムクロック/FDC ルーティング/モーター制御用ゲートアレイ(ASIC)、CPC DSK フォーマット対応の NEC uPD765 FDC、8041 デイジーホイールプリンターコントローラー。仮想モードと物理モードをサポート。
Einstein TC-01 EinsteinTC01 Tatung Einstein TC-01。Z80A @ 4MHz、64KB RAM + 8KB 切替可能 ROM、WD1770 FDC、TMS9129 VDP、AY-3-8910 PSG、Z80 CTC、Z80 PIO。仮想モードと物理モードをサポート。
PCW-9512 ペルソナには完全なブートストラップシーケンスエミュレーションが含まれます:ゲートアレイのバイトストリームが BIOS をロードし、その BIOS がディスクから CP/M をロードします。ゲートアレイコマンドには、ブートストラップ終了、リブート、FDC 割り込みルーティング(NMI/INT/無視)、ターミナルカウント、モーター ON/OFF が含まれます。
ディスクイメージング:picoZ80 は PCW-9512 ペルソナで動作している際に物理フロッピーディスクをイメージングできます。dskimage ICE コマンドは、ホスト FDC 経由で全トラックを読み取る Z80 コードを注入し、結果を CPC DSK ファイルとして SD カードに保存します。使用方法の詳細は ICE コマンドリファレンスを参照してください。

Tatung Einstein シリーズ

picoZ80 は Tatung Einstein TC-01 をサポートしています — 内蔵フロッピーディスクドライブを備えた Z80A ベースのホームコンピューターです。
マシンペルソナドライバー
各 Tatung ペルソナドライバーは完全な Tatung マシンをエミュレートします。ペルソナはペルソナ選択 Web ページ、または config.json"drivers" 配列の "name" フィールドを編集して選択します。
ペルソナ ドライバー 説明
Einstein TC-01 EinsteinTC01 Tatung Einstein TC-01。Z80A @ 4MHz、64KB RAM + 8KB 切替可能 ROM(X-TAL MOS)、ポート 0x24 による ROM/RAM トグル(任意のアクセスでトグル、書き込みは常に RAM へ)、仮想ディスクサポート付き WD1770 FDC(40 トラック、1 ヘッド、10 セクター、512 バイト — 200KB ディスク)、アクセス間タイミング制御(約 2us 間隔)付き TMS9129 VDP(ビデオディスプレイプロセッサ)、ポート 0x02-0x03 の AY-3-8910 PSG(3 チャンネルサウンド)、ポート 0x28-0x2B の Z80 CTC(4 チャンネル)、ポート 0x30-0x33 の Z80 PIO、ポート 0x20 のキーボードインターフェース。物理ディスクイメージング:物理フロッピーを DSK に読み取り、DSK を物理フロッピーに書き込み。仮想モードと物理モードをサポート。
ディスクイメージング:Einstein TC-01 ペルソナは、dskimage ICE コマンドの read および write サブコマンドによる物理ディスクイメージングをサポートしています。dskimage read は物理フロッピーを SD カード上の DSK ファイルにイメージングし、dskimage write は SD カード上の DSK ファイルを物理フロッピーに書き込みます。

その他のマシン

追加の Z80 ベースマシンのサポートが計画されています。各新マシンは同じペルソナドライバーアーキテクチャに従います — マシンのメモリマップ、I/O、ペリフェラルを実装する専用ペルソナドライバーと、拡張ハードウェア用のインターフェースドライバーです。対応マシンの最新リストについてはプロジェクトリポジトリをご確認ください。
OpenZ80 — 自作ボードや未サポートのマシン向け。独自の Z80 ボードを作成している場合、または専用の picoZ80 ペルソナがまだない Z80 コンピューターを持っている場合は、OpenZ80 ファームウェアビルドを使用してください。その主な魅力は、他の Sharp、Amstrad、Tatung マシンから借用した仮想インターフェースカードを、専用に設計された、あるいは不明な Z80 コンピューターに追加できることです。これにより、それらのカード向けに新しいソフトウェアを書いたり、既存のソフトウェアを自分のマシンで動作するよう適応させたりできます。OpenZ80 は素の Z80 として動作します。物理モードでは 64K のメモリと I/O 空間全体をボードへ通過させ、仮想モードではフラットな 64K RAM を提示し、そこへ自作の ROM イメージを読み込めます。公開するのはマシン非依存のインターフェースカードのみ(MZ-1R12/1R18/1R23/1R37 メモリカード、PIO-3034 パラレルカード、MZ-8BIO3 / MZ-1E24 RS-232C シリアルカード、MZ-1E05 フロッピーインターフェース、Celestite LAN ボード)で、そのいずれも GUI 設定ページでボードに合わせて Base I/O Port を再配置できます。既存のマシンの 1 つを適応させるには、開発者は付属のドライバーとそのモニター / IPL / BIOS ROM ソース(RFS および TZFS プロジェクトの asm/ ディレクトリに Z80 アセンブラーとして提供)を出発点として利用できます — デベロッパーズガイドを参照してください。

ICE(デバッグシェル)

picoZ80 には、Z80 CPU エミュレーションのリアルタイム検査と制御のための組み込みインタラクティブデバッグシェル(ICE — インサーキットエミュレーター)が含まれています。
ICE デバッグシェルは DBGSH ファームウェアバリアントに含まれています。標準ファームウェアを使用している場合、デバッグシェルは利用できません。ICE 機能を有効にするには DBGSH バリアントをフラッシュしてください。
接続方法:デバッグシェルは 2 番目の USB シリアルポートで利用できます。picoZ80 を USB 接続すると、ホストコンピューターに 2 つのシリアルポートが表示されます — 1 つ目は標準デバッグログ出力、2 つ目がデバッグシェルです。任意のターミナルエミュレーターで 115200 baud、8N1 で接続してください。接続するとプロンプト dbg> が表示されます。
主な機能:
  • レジスター検査regs で全 Z80 レジスター、フラグ、サイクルカウントを表示。
  • メモリダンプdm p 0000 100 でアドレス 0x0000 から 256 バイトを物理バス経由でダンプ。dm v 0000 100 で仮想 PSRAM を直接読み取り。
  • ブレークポイントbp E800 で 0xE800 にブレークポイントを設定。最大 8 個。bl で一覧表示、bc * で全クリア。
  • シングルステップhold で CPU を一時停止し、step で 1 命令を実行して前後のレジスタ状態を表示。
  • 実行トレースtrace on で全実行命令を記録。trace dump 20 で最後の 20 命令をディスアセンブリ付きで表示。
  • ディスアセンブリdis v E800 20 で 0xE800 から 32 命令をディスアセンブル。
  • I/O アクセスin D8 でポート 0xD8 を読み取り。out D8 03 でポート 0xD8 に 0x03 を書き込み。
  • システム情報status で CPU 周波数、PSRAM クロック、エミュレーション速度、稼働時間を表示。drivers でアクティブなドライバーを一覧表示。
プロンプトで help と入力すると簡易サマリーが表示されます。

コマンドリファレンス
ICE の全コマンドセットを以下に示します。すべてのアドレスおよびデータ値は 0x プレフィックスなしの 16 進数で入力します。
コマンド パラメータ 説明
help 利用可能な全コマンドのサマリーを表示。
regs Z80 レジスターセット全体をダンプ:メインレジスター(AF、BC、DE、HL)、裏レジスター(AF’、BC’、DE’、HL’)、インデックスレジスター(IX、IY)、スタックとプログラムカウンター(SP、PC)、割り込み状態(I、R、IM、IFF1、IFF2)、デコードされたフラグ(S、Z、H、P/V、N、C)、HALT ライン状態、MEMPTR、累積 T サイクルカウント。
dm <p|f|v|r> <addr> [len] メモリを 16 進および ASCII でダンプ。4 つのモード:p(物理)は Z80 バス経由で読み取り実ハードウェアをトリガー、f(フェッチ)は M1 フェッチサイクルを使用して読み取り、v(仮想)はバスアクティビティなしで PSRAM を直接読み取り、r(RP2350)はマイクロコントローラー自身のアドレス空間(Flash、SRAM、ペリフェラル)を読み取り。addr は開始アドレス、len はバイト数(デフォルト 256)。
search [p|v] <start> <end> <hex..>|"text" メモリ内のバイトパターンまたは ASCII テキスト文字列を検索。p = 物理バス、v = 仮想 PSRAM、省略時はマップ済み(メモリマップに従う)。パターンは 16 進バイト(例:ED 4D 00)または引用 ASCII 文字列(例:"HELLO")で指定。一致箇所は前後 8 バイトのコンテキスト付きで表示。物理/マップ済みアクセス時は CPU を自動ホールド。パターン長は最大 32 バイト。
cmp [f] <phys> <virt> <len> 物理バスメモリと仮想 PSRAM を比較。オプションの f は読み取りサイクルの代わりにフェッチ(M1)サイクルを使用。不一致をアドレスと値で報告。
dis [p|v] [addr] [count] Z80 マシンコードをディスアセンブル。p は物理バスから、v は仮想 PSRAM(デフォルト)からオペコードを読み取り。addr のデフォルトは現在の PC。count は命令数(デフォルト 16)。現在の PC は > でマークされる。
asm [addr] addr(デフォルト:現在の PC)からインタラクティブ Z80 アセンブラーを起動。Z80 ニーモニックを 1 行ずつ入力。アセンブルされたバイトは仮想 PSRAM に書き込まれ、アドレスが進みます。db および dw/defw ディレクティブをサポート。空行または . で終了。
memmap [block] SRAM メモリブロックポインターテーブルを表示。各エントリにブロック番号、Z80 アドレス範囲、メモリタイプ(PHYSICAL、RAM、ROM、FUNC)、バンク番号、PSRAM オフセットを表示。block 指定時はその 512 バイトブロックのみ表示。
memptr [addr] 指定アドレスの PSRAM memPtr/memioPtr テーブルを表示。ハンドラー関数ポインターと属性を表示。
iomap [port] I/O ポートハンドラーテーブルを表示。各エントリにポートアドレス、ハンドラー関数、方向(読み取り/書き込み/両方)を表示。port 指定時はそのポートのみ表示。
status システムステータス概要:RP2350 CPU 周波数、PSRAM SPI クロック、ホスト Z80 クロック、エミュレーション速度比、空き SRAM、稼働時間。
ver ファームウェアバージョン、ビルド日、Flash パーティションレイアウト(アドレス、サイズ、チェックサム、アクティブフラグ)、著者、ライセンスを表示。
drivers アクティブな全マシンペルソナドライバーとそのサブインターフェースを一覧表示し、初期化状態を表示。
hold Z80 CPU エミュレーションを一時停止。Core 1 は現在の命令を完了してフェッチを停止。シェルはホールドが確認されるまで待機して戻る。out などの実行状態を変更するコマンドの前に必要。
release ホールドされた地点から Z80 CPU エミュレーションを再開。ブレークポイントはアクティブなまま。
go 実行を続行(release と同じ)。その後ブレークポイントにヒットすると、CPU は再び自動的にホールドする。
cont go のエイリアス。現在のホールドポイントから実行を続行。ブレークポイントはアクティブなまま。
step [n] 1 命令(または n 命令)をシングルステップ。各ステップでシェルは実行前のレジスター状態、16 進バイト付きのディスアセンブル命令、実行後のレジスター状態を表示。先に CPU をホールドする必要あり。マルチステップ中にブレークポイントにヒットすると実行は早期に停止する。
bp <addr> 指定 Z80 アドレスにブレークポイントを設定。最大 8 個を同時にアクティブにできる。オペコードフェッチ中に PC がブレークポイントアドレスに一致すると、CPU は自動的にホールドされヒットが報告される。重複アドレスは拒否される。
bc <n|*> ブレークポイントスロット n(0〜7)または全ブレークポイント(*)をクリア。
bl アクティブな全ブレークポイントをスロット番号とアドレスで一覧表示。
wm [p|v] <addr> <byte> [byte]... メモリに 1 つ以上のバイトを書き込み。p = 物理 Z80 バス、v = 仮想 PSRAM、省略時は自動(メモリマップに従う)。複数バイトはスペース区切りで指定可能。物理/マップ済み書き込み時は CPU を自動ホールド。
fill [p|v] <addr> <len> [w|d] <val> メモリ領域を定数値で充填。p = 物理、v = 仮想、省略時は自動。デフォルト 8 ビット、w = 16 ビット、d = 32 ビット(リトルエンディアン)。必要に応じて CPU を自動ホールド。
copy <pv|fp|vp> <src> <len> <dst> 物理と仮想の間でメモリをコピー。pv = 物理読み取りから仮想へ、fp = 物理フェッチから仮想へ、vp = 仮想から物理書き込みへ。CPU を自動ホールド。
memtest <addr> <len> [pattern] 物理メモリを 3 パスでテスト:書き込み+読み取り、書き込み+フェッチ、インターリーブ。デフォルトパターン:昇順バイト。パスごとにエラーを報告。
in <port> Z80 I/O ポートを読み取り。実際の IORQ+RD バスサイクルを駆動し、読み取ったバイトを表示。
out <port> <byte> Z80 I/O ポートにバイトを書き込み。先に CPU をホールドする必要あり。実際の IORQ+WR バスサイクルを駆動。
trace <on|off|dump [n]|clear|rt|byte ...> 実行トレースを制御。on で全実行命令を 512 エントリのリングバッファ(PC、オペコード、フラグ)に記録。off で記録を無効化。dump で最後の n エントリ(デフォルト:全件)をディスアセンブリとデコードフラグ付きで表示。clear でバッファをリセット。rt で命令実行時にリアルタイムトレースをデバッグコンソールに出力。byte でメモリ/IO トランザクションのバイトレベルトレースを有効化。
verify <on|off> 全オペコードフェッチ検証を切り替え。オン時は全フェッチを readPhysicalMem と照合して検証(速度 50% 低下)。オフ(デフォルト)時は 0x00/0xFF オペコードのみチェック。
fwait <0-4> M1(オペコードフェッチ)サイクルに追加ウェイトステートを強制。<n> は 0〜4 の追加 T ステート(0 = オフ、デフォルト)。ウェイトステートで異なる挙動をするコードのデバッグに有用 — 一部のペリフェラルやメモリデバイスは特定のタイミングマージンを必要とします。パラメータなしの場合は現在の設定を表示。
iowait <0-8> I/O 読み書きサイクルに追加ウェイトステートを強制。<n> は 0〜8 の追加 T ステート(0 = オフ、デフォルト)。応答の遅いペリフェラルを診断するために I/O サイクルを引き延ばす。パラメータなしの場合は現在の設定を表示。
corrupt [clear] 検出されたフェッチ破損(PC、フェッチされたオペコード、検証されたオペコード)を表示。clear でログをリセット。
fdctrace <on|off|dump> FDC I/O トレースを有効化、無効化、またはダンプ。on/off で WD1773 FDC レジスターアクセスの 64 エントリリングバッファへの記録を制御。dump で最後の 64 操作を表示し、レジスター名(Status/Command、Track、Sector、Data、DriveSel、SideSel、DDEN)、読み取り/書き込み方向、バイト値、FDC ステータスを表示。
qdtrace <on|off|dump> Quick Disk I/O トレースを有効化、無効化、またはダンプ。on/off で QD SIO レジスターアクセスの 64 エントリリングバッファへの記録を制御。dump で最後の 64 操作を表示し、ポート、方向、バイト値、テープ位置(バイトオフセット)を表示。
piodbg [clear] 全 3 PIO ブロック(PIO 0、PIO 1、PIO 2)の RP2350 PIO ハードウェア診断を表示。FDEBUG スティッキーエラーフラグ(ストール、RX アンダーフロー、TX オーバーフロー)、FSTAT ステータス、FIFO 充填レベル、ステートマシンごとのプログラムカウンター、GPIO 出力イネーブルマスク、GPIO ピンレベルを表示。clear で FDEBUG スティッキーフラグをリセット。PIO ステートマシンのハングやバス競合の診断に有用。
load <p|v> <file> <addr> [len] [ofs] ESP32 SD カードからファイルを Z80 メモリにロード。p = 物理バスへ書き込み、v = 仮想 PSRAM バンク 0 へ書き込み。file は ESP32 上の /sdcard/ からの相対パス。addr は Z80 開始アドレス。len を省略するとファイル全体をロード(最大 64KB)、指定するとそのバイト数をロード(最大 1MB)。オプションの ofs は読み取り開始のファイルオフセット。物理書き込み時は CPU を自動ホールド。PSRAM バンク 63 をスクラッチバッファとして使用。
save <p|pf|v> <file> <addr> <len> Z80 メモリを ESP32 SD カード上のファイルに保存。p = 物理バス経由で読み取り、pf = 物理フェッチ(M1 サイクル)経由で読み取り、v = 仮想 PSRAM バンク 0 から読み取り。file/sdcard/ からの相対パス。addr は Z80 開始アドレス、len は保存するバイト数(最大 64KB)。物理読み取り時は CPU を自動ホールド。物理読み取り中は定期的に DRAM リフレッシュを実行。
dir [path] ESP32 SD カード上のファイルを一覧表示。オプションのパスは /sdcard/ からの相対パス。ファイル名とサイズを表示。
echo [on|off] 文字エコーを切り替えまたは設定。オン(デフォルト)時は入力された文字がターミナルにエコーバックされる。
reset Z80 CPU の即座の強制リセット。エミュレーションはリセットベクター(通常 0x0000)から再起動。
set <reg|flags|memmap|memptr|iomap> <idx> <val> Z80 レジスター、フラグ、メモリマップ、PSRAM memPtr、または I/O ポートマップエントリを実行時に変更。reg は Z80 レジスターを設定、flags はフラグレジスターを設定、memmap/memptr/iomap はメモリまたは I/O 構成を変更。idx はレジスター名またはテーブルインデックス(10 進または 16 進)、val は新しい値。これにより config.json を再読み込みすることなくレジスターとメモリ/IO 構成をホットパッチできる。
hist [n] コマンド履歴バッファを表示。最後の n コマンドを表示(デフォルト:全エントリ、最大 16)。履歴は ESP32 NVS ストレージを通じて電源サイクルをまたいで保持される。
savehst 現在のコマンド履歴を ESP32 NVS ストレージに即座に強制保存。履歴は通常、正常なシャットダウン時に自動的に保存される。このコマンドは即座の保存を強制する。
ipl 8255 PPI ポート C ビット 3 をトグルして IPL リセット(BST モード)を実行。完全な Z80 リセットなしにマシンをブートモードにリセット。BST(ブート)と NST(通常)モードを区別する MZ-80B、MZ-2000、MZ-2500 マシンに有用。
mmutrace MMU 状態や I/O レジスタースナップショットなどのマシン固有のトレース情報をダンプ。出力はペルソナによって異なる — 各ドライバーが独自のトレースハンドラーを登録するため、表示される情報はアクティブなマシンペルソナに依存する。
intcount 割り込みアクノリッジカウントと現在の割り込み状態を表示。割り込み駆動ソフトウェアのデバッグに有用 — 何回の割り込みアクノリッジサイクルが発生したか、現在割り込みが保留中または有効かを表示。
psync [start end] 物理バスを読み取り仮想メモリに書き込むことで、物理メモリを PSRAM に同期。オプションの start および end パラメータでアドレス範囲を指定。省略時は全アドレス空間を同期。DMA 操作後や物理メモリと仮想メモリが分岐した可能性がある場合の診断に有用。
dskimage read <filename> [cylinders] [heads] / write <filename> 物理フロッピーディスクを SD カード上の DSK ファイルにイメージング(read)、または SD カードの DSK ファイルを物理フロッピーに書き込み(write)。dskimage <filename> はデフォルトで read(後方互換)。filename/sdcard/ からの相対 DSK ファイルパス。read で cylindersheads を省略するとジオメトリを自動検出。先に CPU をホールドする必要あり。イメージング中は進捗が報告される。
busdiag PIO 状態、信号レベル、バス競合状態を含むバス診断を表示。ホストバス接続の電気的問題の診断に有用。
fdcimage FDC イメージングの状態と進捗を表示。
fdcdiag FDC 診断情報(コントローラー状態、レジスターダンプ)を表示。
gadiag ゲートアレイ診断情報(コマンド状態、割り込みルーティング)を表示。
一般的なデバッグワークフロー:
  1. 2 番目の USB シリアルポートにターミナルを接続(115200、8N1)。
  2. hold — CPU を一時停止。
  3. regs — 現在のレジスター状態を検査。
  4. dis v — 現在の PC でコードをディスアセンブル。
  5. bp E800 — ブレークポイントを設定。
  6. go — 再開。0xE800 に到達すると CPU が停止。
  7. step 5 — ブレークポイントから 5 命令をシングルステップ。
  8. dm v D000 80 — VRAM の内容を検査。
  9. trace on / go / trace dump 50 — 実行履歴をトレースしてレビュー。

トラブルシューティング

ホストコンピューターが起動しない

  • 向きを確認する — picoZ80 のピン 1 がソケットのピン 1 と一致していることを確認してください。ボードを逆に挿入すると picoZ80 とホストコンピューターの両方が損傷します。
  • 装着を確認する — picoZ80 を取り外して再挿入し、40 本すべてのピンが完全に装着されてボードの下に折れ曲がっていないことを確認してください。
  • SD カードを確認するconfig.json がないか不正な形式の場合、ファームウェアは以前にキャッシュされたフラッシュ設定を使用しようとします。有効な設定が存在しない場合、RP2350 はメモリマップを初期化せず、ホストはオープンバスを認識します。
  • ファームウェアがフラッシュされていることを確認する — picoZ80 を USB で接続し(ホストに挿入せずに)、ボードが PC で列挙されることを確認してください。
  • ホストの電源供給を確認する — picoZ80 は 5V レールから最大 400mA を消費する可能性があります。一部のビンテージコンピューターは電源供給が不安定です。マルチメーターで負荷下の 5V レール電圧を確認してください。

ウェブインターフェースに接続できない

  • WiFi モードを確認する — 初回起動またはファクトリーリセット後、ESP32 は AP モードで起動します。最初に picoZ80 WiFi ネットワークに接続し、次に http://192.168.4.1 に移動してください。
  • 設定された IP アドレスを確認する — 固定 IP でクライアントモードが設定されている場合、IP がネットワークサブネットと一致していることを確認してください。
  • SD カードが存在することを確認する — SD カードの webfs/ にあるウェブアセットが必要です。SD カードがないとウェブサーバーはページを提供できません。
  • webfs ディレクトリを確認する — SD カードに webfs/ ディレクトリが存在し、プロジェクトリポジトリの HTML/CSS/JS ファイルが含まれていることを確認してください。
  • WiFi のファクトリーリセット — 資格情報が失われた場合は、ESP32 ファームウェアを再フラッシュして NVS 設定をクリアし、新しく始めてください。

SD カードが認識されない

  • SD カードが FAT32 でフォーマットされていることを確認してください。NTFS、exFAT、FAT16 はサポートされていません。
  • 別の SD カードを試してください — 一部の大容量または高速カードは ESP32 SPI SD インターフェースとの互換性に問題がある場合があります。
  • 32GB までのカードは十分にサポートされています。非常に大きなカード(32GB 超)は特別なフォーマットが必要な場合があります。
  • SD カードを再装着してください — 取り外して再挿入し、良好な接触を確保してください。

ROM イメージが読み込まれない

  • config.json のファイルパスが SD カード上のファイルの場所と完全に一致していることを確認してください(パスは大文字小文字を区別します)。
  • ROM イメージファイルが SD カードに存在することを確認してください — ファイルマネージャーを使用して期待される場所を参照してください。
  • fileofs 値を確認してください — 不正なオフセットはゴミデータを ROM バンクに読み込みます。
  • メモリマップエントリの size フィールドが ROM イメージファイルより大きくないことを確認してください。サイズが大きすぎるマッピングは未定義データでパディングされます。

ボードが予期せずリセットまたはリブートする

  • picoZ80 にはハードウェアウォッチドッグタイマーがあり、起動中または通常動作中にファームウェアがハングした場合に自動的に RP2350 をリセットします。ボードが繰り返しリブートする場合、起動ステージが時間内に完了しないためウォッチドッグがトリガーされています。
  • SD カードを確認するconfig.json が存在しないか破損していると、設定解析中に起動シーケンスが停止する可能性があります。
  • WiFi 設定を確認する — ESP32 が接続を確立できない場合、RP2350 と ESP32 間の SPI ハンドシェイクがタイムアウトし、ウォッチドッグがトリガーされる可能性があります。
  • SWD デバッグを使用する — デバッグプローブを接続し、ウォッチドッグスクラッチレジスタ(watchdog_hw->scratch[5]scratch[7])を検査します。scratch[6] の起動進捗コードはウォッチドッグが発火する前にファームウェアがどのステージに達したかを示し、scratch[0–3] は最後の 4 回のリセット試行の履歴を保持します。
  • 永続ログを確認する — ファームウェアは plogf() を使用して PSRAM の最後の 4KB に起動クリティカルなメッセージを書き込みます。これらのメッセージはウォッチドッグリセット後も残り、次の正常起動時にデバッグコンソールにダンプされ、リセット前に何が起こったかを明らかにします。

OTA アップデートが失敗する

  • RP2350 OTA アップデートには .bin ファイル(.uf2 ではなく)をアップロードしていることを確認してください。
  • 動作中のファームウェアを保持するために、非アクティブスロットにアップロードしていることを確認してください。
  • OTA アップデートが失敗するか起動しないパーティションになった場合、ブートローダーは以前のアクティブスロットを動作させ続けます — アップロードプロセスを繰り返してください。
  • ESP32 OTA の失敗については、デバッグヘッダーの USB 接続を使用して esptool 経由で再フラッシュしてください。

参考サイト

リソース リンク
picoZ80 プロジェクトページ /ja/picoz80/
picoZ80 テクニカルガイド /ja/picoz80-technicalguide/
pico6502 プロジェクトページ /ja/pico6502/
RP2350 データシート datasheets.raspberrypi.com
Pico SDK ドキュメント raspberrypi.github.io/pico-sdk-doxygen
ESP32-S3 技術リファレンス docs.espressif.com
X(Twitter)プロジェクトプレビュー engineerswork1

FCC / RED 無線規制に関する注意事項

picoZ80 ボードは FCC(米国)または RED(EU)の意図的放射器認証を取得していません。出荷時には、ボードは WiFi アンテナ整合部品が未実装で、ESP32 ファームウェアは NCM Only 構成でビルドされている必要があります。この状態では高周波エネルギーは一切放射されず、ボードは意図的放射器規制の対象になりません。
WiFi を使用したいエンドユーザーは、アンテナ整合回路を実装し、WiFi ファームウェアバリアントをビルドして、自国の管轄区域で適用される趣味愛好家/実験用の免除規定のもとで運用できます。WiFi を有効にしてボードを商業的に販売したい者は、完成したアセンブリについて事前に FCC および/または RED 認証を取得する必要があります。