tranZPUter SW-700

序文

これは tranZPUter SW-700 に関する更新ドキュメントです。VHDL およびサポートソフトウェアにおける多数の変更(例:I/O ポートの再割り当て)により、旧ドキュメントはそのままの状態に保ち、より最近の変更とリリースに対応した更新ドキュメントを作成することが適切と判断されました。

v1.3 ハードウェアの Git ブランチ v2.2-tranZPUter-SW-HW_700_v1.3 における初期リリースは Sharp MZ-700 ホストを対象としており、機能と性能の面でマシンを大幅にアップグレードし、信頼性が高く十分に成熟したものとなっています。

最近、tranZPUter SW-700 プロジェクトを Sharp MZ-2000 に移植し、MZ-2000 互換のビデオモードを提供するだけでなく、Sharp MZ シリーズ FPGA エミュレーション の組み込みも含めて VHDL を大幅にアップグレードしました。この変更は大規模なものであり、CPLD と VHDL ロジックの基本的な構造変更、ビデオ信号ドーターボードアダプター(試作品を以下に掲載)、および MZ-2000 グラフィックスロジックをサポートするためのビデオコントローラーの更新が必要でした。

ビデオコントローラーは Sharp MZ シリーズ FPGA エミュレーションと共用されているため、新しい MZ-2000 の機能をすべて継承しています。

tranZPUter SW-700 上で動作する MZ-2000 グラフィックスコントローラーの、オリジナルの MZ-1R01 グラフィックスボードに対する利点は、内部モニターが緑のレベルでカラーを表示できるようになり、グラフィックスとゲームが内部・外部モニターの両方で完全に使用可能になったことです。

     

tranZPUter SW-700 のコンセプトは引き続き開発が進められており、さらなる潜在的なホスト(X1/2500)へのボードの設置や、Sharp MZ シリーズ FPGA エミュレーション / ZPU、NIOS II、68000 などのソフト CPU といった機能も検討されています。このドキュメントはこれらの開発を反映するために並行して更新されます。

概要

Sharp MZ-700 は 3.54MHz で動作する Z80 CPU をベースとしています。これはヴィンテージ(Z80 は現在でも 33MHz 以上のクロックで動作する新しい産業設計に広く使用されていますが)であり、現代のコンピューター(または Raspberry Pi)と比べると処理能力が低いです。歴史の一部であることに加え、時折有用なソフトウェアベースを持ち、今もファンがいます。Sharp MZ-700 用のソフトウェアエミュレーターは多数書かれており、ソフトウェアの使用を延長させてきましたが、オリジナルハードウェアを使用することには特別な意味があり、これはマシンをオリジナルのまま保ちつつ、BBC Micro の PiCoPro のように、ソフトウェアベースの複数の異なる CPU で処理能力を強化するアップグレードを提供する代替手段です。これはすべて、オリジナルの CPU がトライステートになり、必要に応じて K64F/CPLD/FPGA がバスと基盤となるオリジナルのマザーボードペリフェラルを制御するバスマスタリングによって実現されます。

このアップグレードは、CP/M v2.2 の 64K バージョン(および移植が完了次第、最大 512K の CP/M v3)を可能にする追加 RAM を提供し、Sharp MZ-700 マザーボードペリフェラルにアクセスする際にオリジナルの速度を維持しながらプロセッサの速度を向上させることで、Z80 ハードウェアの機能を拡張します。

この設計は現在成熟して安定していますが、ソフト CPU やビデオハードウェアの強化など、機能を向上させるための開発は継続しています。

tranZPUter SW-700

tranZPUter という名前の由来は、TRANsformable ZPU compuTER(変形可能な ZPU コンピューター)です。オリジナルの tranZPUter に意図されたベース CPU は ZPU Evo です。ZPU Evo は、オリジナルの Z80 をトライステートにして MZ-80A のメモリとペリフェラルに ZPU デバイスとしてアクセスすることで、Sharp MZ-80A にメニュー、SD、ビデオオーバーレイサービスを提供することを目的としていました。

tranZPUter SW-700 は tranZPUter / tranZPUter SW の設計を引き継ぎ、ホストビデオをアップグレードするためのビデオモジュール機能を追加しています。また、基盤となる Z80 ハードウェアをアップグレードして高いパフォーマンスと増大したメモリを実現します。tranZPUter SW-700 は FPGA 上の VHDL ベースの ZPU Evo ではなく、要件へのソフトウェア的なアプローチであるため、ZPU Evo の代わりに Freescale K64F ARM Cortex-M4 を組み込んでいます。このプロジェクトは、MZ-700 向けのソフトウェアを表す SW-700 というサフィックスを追加して設計を区別しています。

tranZPUter SW-700 の設計は Z80 ハードウェアをアップグレードし、Sharp MZ-700 マザーボードから切り離した状態で、Z84C0020 20MHz CPU をオーバークロックすることで 24MHz にて信頼性が検証・確認されたより高いクロックレートでプロセッサを動作させることができます。CP/M や DBase II のようなデータベースなどのプログラムに、CPU の高性能化は恩恵をもたらします。

異なる CPU を提供するには、たとえば PiCoPro で使用されているような既存の ARM ベースのソフトウェア CPU エミュレーションを利用してこの設計のインターフェースを介して MZ-700 バスの CPU シグナルを使用するように適応させるか、FPGA にインスタンス化されたハードウェアベースの「ソフト」プロセッサを使用するかを選択できます。プログラムメモリは MZ-700 マザーボードの 64K、tranZPUter の 512K、高速 K64F の 256K メモリ、FPGA BRAM、またはそれらの組み合わせのいずれかになります。キャッシュ目的を除いて、ソフト/「ソフト」CPU を使用する際に MZ-700 のメモリを使用する必要は実際にはありません。ローカルの K64F/FPGA RAM を持つソフト/「ソフト」CPU を使用する利点は、パフォーマンスが向上し、代替ソフトウェアにアクセスできることです。

ギャラリーには現在の設計の写真があり、ファイルは Gitea にアップロードされており、比較的安定しています。WIP ファイルは常に変動しているためアップロードされません。

ハードウェア

この設計の基本は Z80 バスマスタリング、つまり Z80 を回路から切り離し、必要に応じて残りのコンピューターハードウェアを制御する能力にあります。バスマスタリングは、I/O デバイスからメモリへの高速データ転送(DMA)や、ビデオ/グラフィックスなどのアプリケーション向けのメモリからメモリへの転送などのデバイスによって一般的に使用されていました。Z80 バスを制御するデバイスは、同じ動作を実行するプログラムを走らせる Z80 よりもはるかに速くデータを転送できたため、その利点がありました。

バスマスタリングは、Z80 バスの制御を取得し、メインメモリと SD カード間でデータを転送したり、I/O プロセッサとメニュー表示のためのビデオディスプレイバッファ間でデータを転送するために使用されます。また、ソフトプロセッサがハード Z80 を完全にアイドル状態にして、メインコンピューターの CPU として機能する場合にも使用されます。つまり、ソフト CPU エミュレーターを使用することで、ローカルメモリでアプリケーションを処理し、必要に応じてホストマシンの I/O とビデオバッファ(オリジナルビデオで実行している場合、拡張ビデオはフルスピードで動作します)へのアクセスを遅らせることで、まったく異なるコンピューティング体験を提供します。6809 または 68000 ベースの Sharp MZ-700 を想像してみてください!

この設計はオリジナルの Z80 をドーターカードに引き上げ、必要に応じて制御できるよう複数のシグナルを再ルーティングすることを中心としています。また、マザーボードからビデオ出力を取得し、CPLD を介して FPGA ベースのビデオモジュールに内部ルーティングし、新しいコネクタを介してモジュレーターに再ルーティングする前に、オリジナルまたは拡張ビデオを選択できます。

設計バージョン v1.0 と v1.1 は内部設計であり、リポジトリには表示されません。v1.2 は MZ-700 で組み立てられテストされた最初の設計です。この設計はソフトウェアと FPGA の開発を進め、安定性と信頼性を検証するために使用されました。v1.3 は現在のメインストリーム設計であり、より強力な FPGA、Cyclone IV 75K(またはビルド時に選択可能な Cyclone IV 115K)をベースとしており、より高解像度のグラフィックスと、Z80 クローンの T80 や ZPU Evolution などの代替「ソフト」ハードウェアベースのプロセッサを使用する機能が可能となっています。

v1.2 と v1.3 は、ロジックとソフトウェアに根本的な違いがありますが、git でそれぞれのブランチを維持しています。どちらも実証済みの設計であり、v1.2 の方が製造コストが安くなっています。

v1.2 回路図

バージョン 1.2 は tranZPUter SW-700 設計の最初の公式リリースです。Sharp MZ-80A tranZPUter SW v2.2 と Video Module v2.0 をベースに、Sharp MZ-700 プラットフォームに最適化されています。

v1.2 Z80 アップグレード回路図

Sheet 1

他の Sharp モデル(MZ-80A など)向けのプログラムや 64K CP/M を実行できるようにするため、この設計は必要なページングロジックを備えた 512KB スタティック RAM デバイスを追加しています。旧型の MAX7000 シリーズ 512 マクロセル CPLD が使用されており、これらのデバイスは 5V 耐性があるため、Sharp MZ-700 の 5V シグナルと CPLD/FPGA で使用される 3.3V シグナル間の電圧変換回路を節約できます。CPLD はデコードロジック、I/O リマッピング(キーボードなど)、および FPGA(3.3V 耐性のみ)へのインターフェースを提供します。CPLD は電圧変換機能に加え、512 マクロセルの制限内で機能を自由に追加できる非常に柔軟な開発環境を実現します。

上記の回路図は、ボードを MZ-700 に設置できるように設計されており、CPLD は電源投入時に追加機能が有効にならず、マシンがオリジナルの状態になるように設定されます。Z80 が CPLD の I/O レジスタに書き込むことで、必要に応じて機能を有効にすることができます。これにより、ソフトウェアとの最大互換性を維持するためにマシンをオリジナルに保つという要件を満たします。

v1.2 K64 I/O プロセッサー

Sheet 2


組み込みデバッグ、開発・学習ツール、SD カード、ソフトプロセッサ、オフロードされたコプロセッササービスなどの拡張機能を提供するために、Freescale K64F ARM Cortex-M4 CPU が設計に追加されています。このプロセッサは CPLD/Z80 との必要なハードウェア接続をすべて備えており、tranZPUter SW-700 ボードや MZ-700 マザーボードのあらゆる側面を読み取ったり制御したりする機能を持っています。デフォルト条件では、K64F は Z80 と連携して TZFS 拡張モニターをロードし、SD ドライブを提供し、MZ-80A などの代替 MZ シリーズエミュレーションの提供を支援します。

K64F は組み込み OS として zOS を使用しているため、MZ-700 に USB 接続して、CPU 周波数の変更、メモリの編集/ダンプ、レジスタの変更などを行う組み込みセッションとユーザーがやり取りできます。この機能は、コンピューターの仕組みを学ぶためや Z80/ARM コードのデバッグに最適です。

オプション機能として、USB ケーブルを介して K64F ファームウェアを更新できる PJRC ブートストラップ MCU のインストールと使用があります。この MCU がない場合、JTAG インターフェースと Freescale FRDM-K64F 開発ボードで提供されるような互換性のある Open SDA インターフェースを使用して K64F ファームウェアを更新する必要があります。このオプションデバイスを使用するために、5 つのはんだジャンパーセットがあります。JP1-5 のパッド 1-2 を接続すると PJRC MCU のプログラミングと使用が可能になり、JP1-4 のパッド 2-3、JP5 のピン 1-2 を接続すると SWD プロトコルを使用した JTAG インターフェースによるプログラミングが可能になります。

K64F への電力供給には別の 3.3V レギュレーターが使用されています。CPLD/FPGA の要件と組み合わせてより大きな LDO を使用するのではなく、K64F に電力を供給するために別の LDO を意図的に使用することが選択されました。

注:SD カードから zOS コンソールを介して K64F に新しいファームウェアをフラッシュする zOS アプリケーションが開発中であり、PJRC または JTAG ツールを使用する必要がなくなります。このツールは zOS v1.2 で利用可能になる予定です。

v1.2 JTAG プログラミングと発振器

Sheet 3


この設計では CPLD と FPGA の両方が使用されており、どちらも JTAG インターフェースを介したプログラミングが必要です。Altera のベストプラクティスに従い、JTAG インターフェースは最も高い電圧のデバイス(CPLD)に最初に配線され、より低い電圧の FPGA にデイジーチェーン接続されます。推奨プルアップ/ダウン抵抗は Altera の仕様に従っています。

FPGA は内部ロジックマトリックスを設定するためのビットストリームを必要とし、これにより望ましいハードウェア機能が提供されます。これは JTAG インターフェースを介してリアルタイムで行うことができますが、電源投入時の問題は解決されません。これが Cyclone III FPGA ブートストラップピンに接続された 16Mbit EPCS16 の理由です。EPCS16 は、JTAG プログラミングを EPCS16 プログラミングに変換する Altera 提供の IP(知的財産)を使用して Cyclone III を介してプログラムされます。プログラムされると、電源投入時または CONFIG スイッチを押すと、EPCS16 の内容が FPGA に読み込まれ、ロジックマトリックスが設定されます。

FPGA には 4 つのオンボード PLL デバイスがあるため、メインクリスタルは Cyclone III FPGA に供給され、これが内部の同期シグナルとビデオモードクロックすべてのタイムベースとして機能します。Z80 が使用する周波数、つまりマザーボード周波数 SYSCLK と K64 が生成する代替周波数 CTLCLK も同期を可能にするために Cyclone III に供給されます。

v1.2 電源

Sheet 4


より高度なテクノロジーを使用するには、オリジナルの 5V 標準とは異なる電圧が必要です。CPLD は動作に 3.3V が必要であり、FPGA は内部動作に 1.2V、アナログおよび PLL デバイスに 2.5V、選択可能な I/O 電圧(この設計では CPLD とのインターフェースのため 3.3V)が必要です。

これらの電圧を生成するために、各レール 1A と指定された 3 つの LDO デバイスが使用されています。Altera ツールを使用することで、CPLD/FPGA の最大電力要件はこれらの LDO デバイスとオリジナルの Sharp MZ-700 PSU で満たされます。

さらに、CPLD/FPGA デバイスを使用するには大きなデカップリングが必要であり、Altera は必要な数と値を計算するための動的スプレッドシートを提供しています。これが上記の回路図に反映されています。

v1.2 ビデオインターフェース

Sheet 5


この設計での拡張ビデオの提供方法は、Video Module v2.0 で使用された方法とは異なります。マザーボードのほとんどの IC がはんだ付けされており、内部の拡張スペースも大きな問題であるため、既存の IC をマザーボードから持ち上げることができませんでした。代替方法が検討された末、FPGA からの拡張ビデオを提供するだけでなく、オリジナルビデオもそのまま残し、必要に応じてソフトウェアで切り替えることができるメカニズムに決定しました。

このメカニズムを使用することで、ビデオシグナルはマザーボードのモジュレーターコネクタから引き上げられ、CPLD(CPLD は 5V 耐性)を介して FPGA にルーティングされ、FPGA はオリジナルビデオを出力に切り替えるか、独自のビデオを生成します。CPLD は、拡張 FPGA ビデオが使用されている際にオリジナルのビデオハードウェアへのシグナルがバストライステートメカニズムを介してブロックされるよう、マザーボードの有効化を管理します。

Video Module v2.0 では、オリジナルの MZ-700 ハードウェアよりも大きな色深度を与えるために、カラーごとに 4 ビット(3:0)が出力され、ビデオ RAM の属性ビットから直接駆動されるか、カラーパレットルックアップテーブルを介して駆動されます。この設計ではオリジナルのモジュレーターとの互換性を維持する必要があるため、カラーごとに 5 番目のビットが追加されており、デジタル RGB モニターおよびモジュレーター内のコンポジット/TV 用回路が、アナログ RGB の要件の 0〜0.75Vp-p とは異なり、論理 1 に対して 2V より大きい電圧で駆動されます。デジタル RGB モニターを駆動する場合またはコンポジット/TV 出力を駆動する場合、5 番目のビットは他のすべてのビットと共にアクティブになり、デジタル 1 の場合に 2.0V 以上を保証します。アナログ RGB モニターを駆動する場合、5 番目のビットをアクティブにすると入力が過飽和になるため、このビットをアクティブにすることができませんが、ビットが hi-Z または 0 レベルに設定されている場合は、5 番目のビットをさらに 16 セットのカラーシェードを作成するために使用できます(例:R[3:0] + 0、G[3:0] + 0、B[3:0] + 0 または R[3:0] + hi-Z、G[3:0] + hi-Z、B[3:0] + hi-Z)。5 番目のビットが 0 に設定されている場合、10R 抵抗が回路内に見えると、他の 4 ビットの電流シンクとして機能し、モニターが見る電圧を下げます。これにより、カラーごとに 32 の固有の電圧レベルが提供されます。5 番目のビットが hi-Z(高インピーダンス)に設定されている場合、ビット 3:0 からの電圧出力に無視できる変化があります。

v1.2 PCB


MZ-700 内に収まる PCB の要件は、マザーボードコンポーネント、ケースの障害物、発熱などに影響しない設置可能な場所という観点から正確である必要がありました。また、ボードは Z80 ソケットに収まりながら、同時にモジュレーターコネクタに接続する必要があり、両方がボードを電気的に接続し機械的に安定させるアンカーポイントを提供します。

この設計では 3 つの高密度 TQFP パッケージを使用しており、ルーティングなどの複雑さが増しています。0.5mm ピッチで広い面積にわたって出力されるランドのためのスペースと、電力配分およびデカップリングのためのスペースが必要です。ボードは製造コストを最良にするために意図的に 2 層に保たれており、通常は 10 枚のボードにステンシルを含めて US$60 であり、多層にするとコストが 2 倍以上になり、サイズ削減もわずかです。

以下のボードは Sharp MZ-700 用に完全に組み立てられテストされた PCB であり、物理的なマシンに設置された様子を示す画像も含まれています。

PCB TopSide

PCB UnderSide

Installed, no case

Installed with case


v1.3 回路図

バージョン 1.3 は v1.2 の動作設計を引き継ぎ、FPGA をより高度なコンポーネントである Cyclone IV EP4CE75(75K ロジックエレメントデバイス、340KB を超えるブロック RAM)に変更しています。ビルド時オプションで Cyclone IV EP4CE115(115K ロジックエレメントデバイス、480K を超えるブロック RAM)を使用することができます。これらのデバイスにより、より高度なグラフィックス、より高い解像度、より多くの同時使用カラーが可能になります。また、「ソフト」HDL ベースの CPU の作成も可能にし、完全に FPGA ベースになる(つまり Z80 なし、ただし FPGA でソフト CPU としてインスタンス化された Z80 のみを含む Z80 エクステンダーソケット)オリジナルの ZPU ベースの tranZPUter の次のイテレーションへのステッピングストーンとなります。

v1.3 Z80 アップグレード回路図

Sheet 1

バージョン 1.3 は FPGA と CPLD/FPGA 間の追加の相互接続を除いて、すべての面で v1.2 と同一です。v1.2 は TQFP パッケージの 25K LE を持つ Cyclone III を使用しており、v1.3 は 75K LE を持つ Cyclone IV を使用し、484 ピン BGA としてパッケージ化されています。作業の大部分はデカップリング、ピン割り当て、PCB 製造を中心としていました。

v1.3 K64 I/O プロセッサー

Sheet 2


K64F の回路図は、相互接続の再作業(有用な機能を果たさなくなったものの削除と、メモリおよび FPGA リソースの完全な 24 ビット直接アドレッシングを可能にするための追加)を除いて v1.2 と同じです。

v1.3 JTAG プログラミングと発振器

Sheet 3


バージョン 1.3 では FPGA が変更され、その結果クロックが異なるクロック入力に割り当てられます。さらに、デバイスが大きくなったため、EPCS64 という 64mbit シリアルフラッシュ RAM の形式でより大きなブートデバイスが必要になります。v1.2 でコンフィグスイッチが冗長であることが判明したため、v1.3 から削除されました。JTAG または PJRC MCU を介したプログラミングは自動的に FPGA コンフィグモードを起動します。

v1.3 電源

Sheet 4


より大きな FPGA デバイスを使用すると、デカップリングの需要が増大します。Altera の PDN ツールにより、34 個以上のデカップリングコンデンサーが必要と判断されました。これは PCB の配置とルーティングに興味深い課題をもたらしました!

v1.3 ビデオインターフェース

Sheet 5


ビデオインターフェースは v1.2 と同じです。

v1.3 PCB


バージョン 1.3 PCB は v1.2 の改版であり、144 ピン TQFP を 484 ピン BGA に置き換えています。両者はサイズが同一ですが、一部の部品配置とルーティングが異なります。PCB は 2 層設計のままですが、BGA の組み込みによりより小さなビア/ランドのジオメトリとマスクまたは充填されたビアが採用されています。これにより、v1.2 設計と比べて PCB 製造コストが数倍に増加します。PCB にはルーティングエラーがあり、製造コストを考慮して改修が必要となり、BGA パッドの再ルーティングと穴あけという複雑な作業が必要でした。しかしこの作業は忘れられないものになりました。「二度計って一度切る」という古い格言が思い浮かびますが、私は二度計ったにもかかわらず最終確認を怠り、特にエラーが発生したと思われるコンピュータクラッシュの後において確認不足でした。これは私のミスです!

PCB TopSide

PCB UnderSide

PCB Installed

設計詳細

このセクションでは、tranZPUter SW-700 の動作とホスト(オリジナルのコンピューター)との相互作用を理解するための内部設計情報を提供します。

K64F Z80 ホスト API

API は、プロセッサ間通信が行われる Z80 の 64K メモリ空間内の共通 RAM ブロックに基づいています。K64F 側では、これは C の構造体として宣言され、Z80 側ではメモリ変数へのアセンブラ参照として宣言されます。
// Structure to contain inter CPU communications memory for command service processing and results.
// Typically the z80 places a command into the structure in its memory space and asserts an I/O request,
// the K64F detects the request and reads the lower portion of the struct from z80 memory space,
// determines the command and then either reads the remainder or writes to the remainder. This struct
// exists in both the z80 and K64F domains and data is sync'd between them as needed.
//
typedef struct __attribute__((__packed__)) {
    uint8_t                          cmd;                                // Command request.
    uint8_t                          result;                             // Result code. 0xFE - set by Z80, command available, 0xFE - set by K64F, command ack and processing. 0x00-0xF0 = cmd complete and result of processing.
    union {
        uint8_t                      dirSector;                          // Virtual directory sector number.
        uint8_t                      fileSector;                         // Sector within open file to read/write.
        uint8_t                      vDriveNo;                           // Virtual or physical SD card drive number.
    };
    union {
        struct {
            uint16_t                 trackNo;                            // For virtual drives with track and sector this is the track number
            uint16_t                 sectorNo;                           // For virtual drives with track and sector this is the sector number. NB For LBA access, this is 32bit and overwrites fileNo/fileType which arent used during raw SD access.
        };
        uint32_t                     sectorLBA;                          // For LBA access, this is 32bit and used during raw SD access.
        struct {
            uint8_t                  memTarget;                          // Target memory for operation, 0 = tranZPUter, 1 = mainboard.
            uint8_t                  spare1;                             // Unused variable.
            uint16_t                 spare2;                             // Unused variable.
        };
    };
    uint8_t                          fileNo;                             // File number of a file within the last directory listing to open/update.
    uint8_t                          fileType;                           // Type of file being processed.
    union {
        uint16_t                     loadAddr;                           // Load address for ROM/File images which need to be dynamic.
        uint16_t                     saveAddr;                           // Save address for ROM/File images which need to be dynamic.
        uint16_t                     cpuFreq;                            // CPU Frequency in KHz - used for setting of the alternate CPU clock frequency.
    };
    union {
        uint16_t                     loadSize;                           // Size for ROM/File to be loaded.
        uint16_t                     saveSize;                           // Size for ROM/File to be saved.
    };
    uint8_t                          directory[TZSVC_DIRNAME_SIZE];      // Directory in which to look for a file. If no directory is given default to MZF.
    uint8_t                          filename[TZSVC_FILENAME_SIZE];      // File to open or create.
    uint8_t                          wildcard[TZSVC_WILDCARD_SIZE];      // A basic wildcard pattern match filter to be applied to a directory search.
    uint8_t                          sector[TZSVC_SECTOR_SIZE];          // Sector buffer generally for disk read/write.
} t_svcControl;

通信はすべて Z80 によって開始されます。サービスが必要な場合、Z80 は svcControl.cmd フィールドにコマンドを書き込み、svcControl.result フィールドを REQUEST に設定します。Z80 は次に出力ポート(設定可能ですが通常は 0x68)に書き込み、これが K64F への割り込みを送信します。K64F はコマンドを読み取り、svcControl.result を PROCESSING に設定します。Z80 はこのハンドシェイクを待ち、タイムアウト期間後に受信できない場合はコマンドを再送します。Z80 は有効な結果を待ち、合理的な時間内に結果が得られない場合はシーケンスを再試行し、一定回数の試行後にエラーで終了します。

K64F がコマンドを処理し(例:ディレクトリの読み取り)、必要なデータを構造体に格納すると、トランザクションを完了するために svcControl.result を有効な結果(成功、失敗、またはエラーコード)に設定します。

API コマンドリスト

コマンド Cmd# 説明
TZSVC_CMD_READDIR 0x01 ディレクトリを開き、エントリの最初のブロックを返します。
TZSVC_CMD_NEXTDIR 0x02 開いているディレクトリの次のブロックを返します。
TZSVC_CMD_READFILE 0x03 ファイルを開き、最初のブロックを返します。
TZSVC_CMD_NEXTREADFILE 0x04 開いているファイルの次のブロックを返します。
TZSVC_CMD_WRITEFILE 0x05 ファイルを作成し、最初のブロックを保存します。
TZSVC_CMD_NEXTWRITEFILE 0x06 開いているファイルに次のブロックを書き込みます。
TZSVC_CMD_CLOSE 0x07 開いているファイルまたはディレクトリを閉じます。
TZSVC_CMD_LOADFILE 0x08 ファイルを tranZPUter メモリに直接ロードします。
TZSVC_CMD_SAVEFILE 0x09 tranZPUter メモリからファイルを直接保存します。
TZSVC_CMD_ERASEFILE 0x0a SD カード上のファイルを消去します。
TZSVC_CMD_CHANGEDIR 0x0b SD カード上のアクティブディレクトリを変更します。
TZSVC_CMD_LOAD40ABIOS 0x20 SA1510 BIOS の 40 列バージョンをロードするよう要求し、Sharp MZ-80A に合わせて周波数を変更します。
TZSVC_CMD_LOAD80ABIOS 0x21 SA1510 BIOS の 80 列バージョンをロードするよう要求し、Sharp MZ-80A に合わせて周波数を変更します。
TZSVC_CMD_LOAD700BIOS40 0x22 1Z-013A MZ-700 BIOS の 40 列バージョンをロードするよう要求し、Sharp MZ-700 に合わせて周波数を変更してメモリページコマンドを実行します。
TZSVC_CMD_LOAD700BIOS80 0x23 1Z-013A MZ-700 BIOS の 80 列バージョンをロードするよう要求し、Sharp MZ-700 に合わせて周波数を変更してメモリページコマンドを実行します。
TZSVC_CMD_LOAD80BIPL 0x24 MZ-80B IPL のロードを要求し、周波数を切り替えて Sharp MZ-80B 互換モードを有効にします。
TZSVC_CMD_LOAD800BIOS 0x25 MZ800 9Z-504M BIOS のロードを要求するサービスコマンドです。
TZSVC_CMD_LOAD2000IPL 0x26 MZ-2000 IPL のロードを要求するサービスコマンドです。
TZSVC_CMD_LOADTZFS 0x2F TZFS のロードを要求するサービスコマンドです。このサービスは通常モニター BIOS を持たないマシン(MZ-80B/MZ-2000 など)が手動で TZFS を要求する場合に使用されます。
TZSVC_CMD_LOADBDOS 0x30 CPM の BDOS+CCP を再ロードします。
TZSVC_CMD_ADDSDDRIVE 0x31 CPM ディスクをドライブ番号にアタッチします。
TZSVC_CMD_READSDDRIVE 0x32 アタッチされた SD ファイルを CPM ディスクドライブとして読み取ります。
TZSVC_CMD_WRITESDDRIVE 0x33 アタッチされた SD ファイルである CPM ディスクドライブに書き込みます。
TZSVC_CMD_CPU_BASEFREQ 0x40 tranZPUter をマザーボード周波数で Z80 を使用するよう設定します。
TZSVC_CMD_CPU_ALTFREQ 0x41 Z80 を K64F 生成クロック(代替周波数)で動作させるよう切り替えます。
TZSVC_CMD_CPU_CHGFREQ 0x42 K64F によって生成される Z80 周波数を svcControl.cpuFreq で指定されたヘルツ値に変更します。Z80 はこの周波数の最も近いタイマー解像度でクロックされます。
TZSVC_CMD_CPU_SETZ80 0x50 外部 Z80 ハード CPU に切り替えます。
TZSVC_CMD_CPU_SETT80 0x51 内部 T80 ソフト CPU に切り替えます。
TZSVC_CMD_CPU_SETZPUEVO 0x52 内部 ZPU Evolution CPU に切り替えます。
TZSVC_CMD_EMU_SETMZ80K 0x53 内部 Sharp MZ シリーズの MZ80K エミュレーションに切り替えるサービスコマンドです。
TZSVC_CMD_EMU_SETMZ80C 0x54 ”” “” “” MZ80C.
TZSVC_CMD_EMU_SETMZ1200 0x55 ”” “” “” MZ1200.
TZSVC_CMD_EMU_SETMZ80A 0x56 ”” “” “” MZ80A.
TZSVC_CMD_EMU_SETMZ700 0x57 ”” “” “” MZ700.
TZSVC_CMD_EMU_SETMZ800 0x58 ”” “” “” MZ800.
TZSVC_CMD_EMU_SETMZ80B 0x59 ”” “” “” MZ80B.
TZSVC_CMD_EMU_SETMZ2000 0x5A ”” “” “” MZ2000.
TZSVC_CMD_SD_DISKINIT 0x60 基盤となる SD カードを初期化し、ローアクセスを提供します。
TZSVC_CMD_SD_READSECTOR 0x61 基盤となる SD カードへのローレードアクセスを提供します。
TZSVC_CMD_SD_WRITESECTOR 0x62 基盤となる SD カードへのローライトアクセスを提供します。
TZSVC_CMD_EXIT 0x7F TZFS を終了し、オリジナルモードでマシンを再起動します。

API 結果リスト

コマンド Result# 説明
TZSVC_STATUS_OK 0x00 K64F の処理が正常に完了しました。
TZSVC_STATUS_FILE_ERROR 0x01 ファイルまたはディレクトリエラーです。
TZSVC_STATUS_BAD_CMD 0x02 不正なサービスコマンドが要求されました。
TZSVC_STATUS_BAD_REQ 0x03 不正なリクエストが行われました。サービスステータスリクエストフラグが設定されていませんでした。
TZSVC_STATUS_REQUEST 0xFE Z80 がリクエストを送信しました。
TZSVC_STATUS_PROCESSING 0xFF K64F がコマンドを処理中です。

K64F GPIO 構成

この設計では K64F は監視・サービス役を担っています。K64F が存在しない場合でも Z80 は単独で機能でき、ホストマシンは完全にオリジナルの状態を保ちます。さらに tranZPUter ボードは、Z80 が必要に応じて使用できる 512K スタティック RAM などの新しいアップグレードも提供します。

SD カードアクセス、代替 BIOS のロード、または可変代替 CPU クロックなどの高度なサービスが必要な場合は、それらを提供するために K64F が必要です。Z80 は K64F をハードウェア拡張として認識し、I/O リクエストを行って機能を得ます。

例えば Z80 が BIOS のロードを要求した場合、I/O out リクエストを生成して K64F に割り込みを送信します。K64F は Z80 をトライステートバスマスタードモードに置き、SD カードから BIOS を読み取って Z80 ラインを操作し、Z80 RAM に BIOS データを書き込みます。

この機能を提供するために、K64F は Z80 のすべてのシグナルを読み書きできる必要があります。K64F の利点の一つは、5V 耐性のデジタル I/O ポートが豊富にあることであり、そのため 5V Z80 システムの接続と操作は比較的簡単です。

Z80 シグナルの K64F GPIO ポート/ピンへのピン割り当ては、K64F が GPIO ピンを内部レジスタに線形に割り当てていないため、やや断続的になっています。つまり GPIO ピンは 5 つの 32 ビットレジスタに分散されています。この非線形な割り当ては、リアルタイムでの 16 ビットアドレスや 8 ビットデータ値の組み立てとデコードにオーバーヘッドを加えます。

初期の tranZPUter SW 設計では、Z80 ピンの GPIO ポート/ピンへの割り当てが割り込みサービスルーチンでいくつかの問題を引き起こしていましたが、これらはほとんどのタイムクリティカルなロジックを含む CPLD の追加によって解決されました。

以下の表は Z80 シグナルとそれに関連する K64F ピンを示すために作成されています。シグナルは 5 つの 32 ビット内部 K64F レジスタに分散されています。
K64F ポートとビット割り当て
BIT / PORT 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
A                             Z80_NMI Z80_INT   CTL_HALT CTL_RFSH CTL_M1             SYSCLK          
B                 Z80_D7 Z80_D6 Z80_D5 Z80_D4 Z80_D3 Z80_D2 Z80_D1 Z80_D0         CTL_CLKSLCT Z80_WAIT Z80_MEM4           Z80_MEM3 Z80_MEM2 Z80_MEM1 Z80_MEM0
C                           Z80_A16 Z80_A17 Z80_A18 Z80_A15 Z80_A14 Z80_A13 Z80_A12 Z80_A11 Z80_A10 Z80_A9 Z80_A8 Z80_A7 Z80_A6 Z80_A5 Z80_A4 Z80_A3 Z80_A2 Z80_A1 Z80_A0
D                                                 Z80_RD CTL_BUSACK Z80_WR Z80_RESET Z80_IORQ Z80_MREQ CTL_CLK CTL_BUSRQ
E           Z80_BUSACK   SVCREQ                                                
GPIO ビットと Z80 アドレスラインのマッピング
ADDR 18 ADDR 17 ADDR 16 ADDR 15 ADDR 14 ADDR 13 ADDR 12 ADDR 11 ADDR 10 ADDR 9 ADDR 8 ADDR 7 ADDR 6 ADDR 5 ADDR 4 ADDR 3 ADDR 2 ADDR 1 ADDR 0
PORT C:16 PORT C:17 PORT C:18 PORT C:15 PORT C:14 PORT C:13 PORT C:12 PORT C:11 PORT C:10 PORT C:9 PORT C:8 PORT C:7 PORT C:6 PORT C:5 PORT C:4 PORT C:3 PORT C:2 PORT C:1 PORT C:0
GPIO ビットと Z80 データラインのマッピング
DATA 7 DATA 6 DATA 5 DATA 4 DATA 3 DATA 2 DATA 1 DATA 0
PORT B:23 PORT B:22 PORT B:21 PORT B:20 PORT B:19 PORT B:18 PORT B:17 PORT B:16

Z80 メモリモード

tranZPUter SW-700 ハードウェア設計の特長の一つは、512 マクロセル CPLD 内でメモリマップを自由に作成できる機能です。Z80 アドレス空間(または 18 ビット幅までの任意のソフト CPU アドレス空間)内で、512K スタティック RAM、64K マザーボード RAM、ビデオ RAM、I/O を活用した任意のメモリマップをブール式で構築してメモリモードに割り当てることができます。メモリモードは必要に応じて Z80 ソフトウェアで選択でき、TZFS、CP/M、Sharp MZ-700 と MZ-80B の互換モードの実現に活用されています。

メモリモードのベースは tranZPUter SW プロジェクトのバージョン 1 から来ており、当時はデコーダーがフラッシュ RAM に基づいていました。当時必要とされていたすべてのメモリモデル(MZ-700、CP/M など)が考案されました。これらのモードはその後の設計で CPLD 内に強化され、ビデオモジュールなどの新機能に対応し、今後もさらに強化されることでしょう。

定義済みのモードは以下の表に示されており、将来の拡張のためにいくつかの空きスロットが残されています。
モード ターゲット 範囲 ブロック   機能 DRAM リフレッシュ 説明
0 オリジナル 0000:0FFF Main MROM Yes デフォルト、通常のホスト(例:Sharp MZ80A/MZ-700)動作モード。すべてのメモリと IO(tranZPUter 制御 I/O ブロックを除く)はマザーボード上にあります。
    1000:CFFF Main D-RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF Main User ROM    
    F000:FFFF Main FDC ROM    
1 Orig+ UROM 0000:0FFF Main MROM Yes モード 0 と同じですが、User ROM は tranZPUter RAM にマップされ、ロード可能な BIOS イメージに使用されます。
    1000:CFFF Main D-RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF RAM 0 User ROM    
    F000:FFFF Main FDC ROM    
2 TZFS 0000:0FFF RAM 0 MROM No TZFS または tranZPUter RAM の使用を必要とする他のソフトウェアのブートモード。User ROM はモニターには ROM として表示されるため、通常の起動手順の一部として 0xE800 のエントリポイントを呼び出します。0xE800 に格納されたソフトウェアは必要に応じてマザーボードを切り離して tranZPUter RAM で実行できます。F3FE と F7FE に小さな 2 バイト幅の穴がフロッピーディスクコントローラー用に存在し、これらの場所はマザーボード上に必要です。フロッピーディスクコントローラーはデータ読み書きの一部としてこれらを使用します(Z80 が FDC をポーリングするには速度が不十分なため)。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 User ROM    
    F000:FFFF RAM 0 FDC ROM    
3 TZFS 0000:0FFF RAM 0 MROM No TZFS のページモード。F000:FFFF がブロック 1 にある以外はすべての RAM が tranZPUter ブロック 0 にあります。これは TZFS のページバンク 2 です。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 User ROM    
    F000:FFFF RAM 1 FDC ROM    
4 TZFS 0000:0FFF RAM 0 MROM No モード 3 と同様ですが F000:FFFF はブロック 2 にあります。これは TZFS のページバンク 3 です。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 User ROM    
    F000:FFFF RAM 2 FDC ROM    
5 TZFS 0000:0FFF RAM 0 MROM No モード 3 と同様ですが F000:FFFF はブロック 3 にあります。これは TZFS のページバンク 4 です。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 User ROM    
    F000:FFFF RAM 3 FDC ROM    
6 CP/M 0000:FFFF RAM 4 Main RAM No CP/M、すべてのメモリは tranZPUter ボード上にあります。F3C0:F3FF & F7C0:F7FF(フロッピーディスクページングベクター)の特別なケースはマザーボード上にあります。
7 CP/M 0000:0100 RAM 4 CP/M Vectors No CP/M メイン CBIOS エリア、CBIOS と直接マザーボードハードウェアアクセスに 48K + 2K 使用可能。F000:FFFF はバンク 4 に残り、このメモリモードとモード 6 間のゲートウェイとして使用されます。
    0100:CFFF RAM 5 Main RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF RAM 5 User ROM    
    F000:FFFF RAM 4 FDC ROM    
8 Orig+ Emu 0000:0FFF Main MROM Yes オリジナルモードですが、メイン RAM は tranZPUter バンク 0 にあります。このモードは起動時にバンク切り替えを行い、tranZPUter RAM バンク内のメインメモリにロードされたプログラムを期待する MZ-700 プログラムなどのプログラムをブートストラップするために使用されます。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF Main User ROM    
    F000:FFFF Main FDC ROM    
10 MZ-700 0000:0FFF RAM 6 Main RAM No MZ-700 モード(OUT $E0)- モニター RAM がメイン RAM に置き換えられます。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF Main User ROM    
    F000:FFFF Main FDC ROM    
11 MZ-700 0000:0FFF RAM 0 MROM No MZ-700 モード(OUT $E0 + $E1)- I/O とビデオブロックがメイン RAM に置き換えられます。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF RAM 6 VRAM    
    D800:DFFF RAM 6 ARAM    
    E000:E7FF RAM 6 MM I/O    
    E800:EFFF RAM 6 User ROM    
    F000:FFFF RAM 6 FDC ROM    
12 MZ-700 0000:0FFF RAM 6 Main RAM No MZ-700 モード(OUT $E1 + $E2)- モニター RAM が RAM に置き換えられ、I/O とビデオブロックがメイン RAM に置き換えられます。
    1000:CFFF RAM 0 Main RAM    
    D000:D7FF RAM 6 VRAM    
    D800:DFFF RAM 6 ARAM    
    E000:E7FF RAM 6 MM I/O    
    E800:EFFF RAM 6 User ROM    
    F000:FFFF RAM 6 FDC ROM    
13 MZ-700 0000:0FFF RAM 0 MROM No MZ-700 モード(OUT $E5)- 上位メモリがロックアウトされ、モニター ROM がページインされます。
    1000:CFFF RAM 0 Main RAM    
    D000:FFFF n/a Undefined    
14 MZ-700 0000:0FFF RAM 6 Main RAM No MZ-700 モード(OUT $E6)- モニター RAM が RAM に置き換えられ、上位メモリがロックアウトされます。
    1000:CFFF RAM 0 Main RAM    
    D000:FFFF n/a Undefined    
15 MZ-800/MZ-700         以下の表を参照してください。メモリモードは MZ-800 に従います。
16 MZ2000 0000:7FFF RAM 0 IPL ROM No MZ2000 ハードウェアモード、MZ2000 ランタイム設定レジスタに従って設定されます。
    8000:FFFF RAM 6 Lower 32K RAM   IPL モード中、下位 32K RAM が上位 32K アドレスにマップされます。
    0000:FFFF RAM 6 Main RAM   RUN モード中、完全な 64K RAM が Z80 アドレス空間にマップされます。
    D000:DFFF Main VRAM   PIO ポート A ビット 7 がセット、ビット 6 がクリアの場合、ビデオ RAM が Z80 アドレス空間にマップされます。
    C000:FFFF Main GRAM   PIO ポート A ビット 7 がセット、ビット 6 がセットの場合、グラフィックス RAM が Z80 アドレス空間にマップされます。
21 K64F アクセス 000000:FFFFFF n/a FPGA Resources No 完全な 24 ビット Z80 アドレスを通過させて FPGA メモリにアクセスします。通常は K64F から使用されます。
22 FPGA アクセス 0000:FFFF n/a Host Resources Yes ホストマザーボード 64K アドレス空間のみへのアクセスです。
23 K64F アクセス 000000:FFFFFF RAM Main RAM No K64F が完全な 512K RAM をアドレスして tranZPUter ボード上のすべてのメモリと IO にアクセスします。
24 K64F アクセス 0000:FFFF RAM 0 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 0 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
25 K64F アクセス 0000:FFFF RAM 1 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 1 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
26 K64F アクセス 0000:FFFF RAM 2 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 2 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
27 K64F アクセス 0000:FFFF RAM 3 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 3 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
28 K64F アクセス 0000:FFFF RAM 4 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 4 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
29 K64F アクセス 0000:FFFF RAM 5 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 5 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
30 K64F アクセス 0000:FFFF RAM 6 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 6 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
31 K64F アクセス 0000:FFFF RAM 7 Main RAM Yes/No すべてのメモリと IO は tranZPUter ボード上にあります。64K ブロック 7 が選択されています。このモードを使用する際、マザーボード DRAM は tranZPUter ライブラリによってリフレッシュされます。
凡例:
MROM = モニター ROM、オリジナルのブートファームウェア(例:SA-1510)
D-RAM = マザーボード上のダイナミック RAM。
VRAM = マザーボード上のビデオ RAM。
ARAM = マザーボード上のカラー属性 RAM。
MM I/O = マザーボード上のメモリマップド I/O コントローラー。
RAM 0 .. 7 = 512K スタティック RAM チップ内の 64K RAM ブロック番号。
Main = ホストコンピューターのマザーボード(例:Sharp MZ-80A マザーボード)。
MZ700/MZ800 メモリモード
MZ-700           MZ-800            
レジスタ 0000:0FFF 1000:1FFF 1000:CFFF C000:CFFF D000:FFFF 0000:7FFF 1000:1FFF 2000:7FFF 8000:BFFF C000:CFFF C000:DFFF E000:FFFF
OUT 0xE0 DRAM         DRAM            
OUT 0xE1         DRAM             DRAM
OUT 0xE2 MONITOR         MONITOR            
OUT 0xE3         Memory Mapped I/O             Upper MONITOR ROM
OUT 0xE4 MONITOR   DRAM   Memory Mapped I/O MONITOR CGROM DRAM VRAM   DRAM Upper MONITOR ROM
OUT 0xE5         Inhibit             Inhibit
OUT 0xE6         <return>             <return>
IN 0xE0   CGROM*   VRAM*     CGROM   VRAM      
IN 0xE1   DRAM   DRAM     <return>   DRAM      
凡例:
<return> = 補完コマンドが呼び出される前の状態に戻ります。
* = MZ-800 ホストのみ。

Z80 CPU 周波数切り替え

tranZPUter SW-700 を他のマシンと互換性を持たせるためには、そのマシンの速度で CPU をクロックする必要があります。また、最大パフォーマンスを得るために CP/M などのソフトウェア使用時は CPU をできるだけ速くクロックすることが望ましいです。

周波数切り替えの主な問題は、基盤となるホストの周波数を変更できないことです。ホストは一般にクロックを生成しており、その回路はクロック許容範囲内で動作するように設計されています。tranZPUter SW-700 は以下に説明するようにこの制限を克服しています。

切り替え可能な Z80 CPU 周波数の要件を満たすために、ホスト周波数を 1 つの入力として受け取り、K64F からの矩形波ジェネレーターを 2 番目の入力として受け取る正エッジトリガーの周波数切り替えが実装されています。切り替えメカニズムはバス制御ロジックに関連付けられているため、ホストへのアクセスはすべて CPU の周波数がホスト周波数に変更され、継続的な信頼性の高い動作を保証します。起動条件では、マシンのオリジナル仕様を満たすために Z80 は常にホストクロックでクロックされます。

K64F が存在する場合、K64F はそのオンボードタイマーを使用してプログラム可能な矩形波出力を生成する機能を持つため、2 番目の周波数を選択できます。K64F はこの 2 番目のクロックソースの周波数を設定し、Z80 は I/O OUT コマンドを介してそれを選択できます。これにより、Z80 上で実行しているソフトウェアは自身の周波数を変更できます(ただし固定された値のみ)。K64F ホスト API への拡張により、Z80 は K64F に Z80 CPU 周波数を任意の可能な値に設定するよう要求できます。これは TZFS や CP/M でユーザーが独自の周波数を選択できるようにするために有用です。

CMOS Z84C0020 20MHz CPU での現在のテストでは以下の観察結果があります:
  • tranZPUter はすべての機能において 1Hz から 24MHz の範囲で信頼性があります。
  • マザーボードへのアクセス時、周波数は 3.54MHz(システムクロック)まで遅くなり、マザーボードアクセスが完了した後に高い周波数に戻ります。

トレーニングやデバッグ目的で CPU を遅くすることも可能ですが、ホスト回路へのアクセスは常にホストクロック周波数で実行されます。

Z80 上で実行されているアプリケーションの場合、以下の表は周波数を切り替えるために読み書きする必要がある I/O ポートを示しています。
Z80 CPU 周波数切り替えポート
ポート 方向 機能
0x62 W Z80 CPU 周波数を 2 番目のソース(K64F または外部発振器で生成される周波数)に切り替えます。
0x64 W Z80 CPU 周波数をデフォルトのホストソースに切り替えます。これは RESET 時のデフォルトです。
0x66 R ビット [0] - 選択されたクロック、0 = ホストクロック、1 = 2 番目のクロックソース(K64F または外部発振器)。

システム設定

CPLD は内部設定レジスタを保持しており、基盤となるホストとの動作方法を変更できます。以下の表はポートと各ビットの機能を示しています。

システム設定レジスタ(0x6E - 10 進数 110)
ビット 方向 説明
2:0 R/W ハードウェアモデルの互換性を設定します。これにより CPLD が設定されたモデルと互換性を持つようにホストハードウェアをリマップします。
000 = MZ-80K
001 = MZ-80C
010 = MZ-1200
011 = MZ-80A
100 = MZ-700
101 = MZ-800
110 = MZ-80B
111 = MZ-2000
3 R/W マザーボードビデオの状態を設定します。0 = 有効、1 = 無効。マザーボードビデオが有効な場合、FPGA 拡張ビデオは無効になります。
4 R/W FPGA ビデオフレームレンダリング中に使用されるビデオウェイトステートジェネレーターを設定します。0 = ウェイトステート無効、1 = 有効。
6:5 R/O マザーボード/CPU クロック。
00 = Sharp MZ80A 2MHz システムクロック。
01 = Sharp MZ80B/2000 4MHz システムクロック。
10 = Sharp MZ700 3.54MHz システムクロック。
11 = 予約、デフォルトは 2MHz システムクロック。
7 R/W リセット時に設定を保持(=1)またはリセット時にデフォルトに設定(=0)します。

注:実装された互換モードは以下の段落に記載されており、他のモードはまだ実装されていません。未実装のモードを選択するとマッピングなしになり、基本の MZ-700 ハードウェアに戻ります。

CPLD は実行中のマシンの機能を示す読み取り専用の情報レジスタも保持しています。

システム情報レジスタ(0x6F - 10 進数 111)
ビット 方向 説明
2:0 R tranZPUter が設置された基盤となるホストモデル(物理的なコンピューターハードウェア)。
000 = MZ-80K
001 = MZ-80C
010 = MZ-1200
011 = MZ-80A
100 = MZ-700
101 = MZ-800
110 = MZ-80B
111 = MZ-2000
3 R FPGA ビデオモジュールが設置されているか、0 = 設置なし、1 = 設置あり。
7:5 R CPLD のバージョン番号。新しいバージョンの CPLD VHDL が異なる機能を提供する場合に Z80 コードで使用されます。

CPLD は基盤となるホストの細かい制御を支援するための基本的なコマンド機能を含んでいます。コマンドは CPLD コマンドレジスタへの書き込みによって開始されます。

システムコマンドレジスタ(0x6B - 10 進数 107)
ビット 方向 説明
7:0 W CPLD にコマンドを発行します。
01 - 基盤となるホストをリセットします。
02 - 基盤となるホストの BUSREQ をアクティブにして CPU を保留します。
03 - アクティブな BUSREQ 保留を解放します。

ソフトプロセッサ

tranZPUter プロジェクトの主な目標の一つは、ホストマシン上でさまざまな物理プロセッサを実行できるようにすることでした。このプロジェクトでは、ホストは Zilog Z80 プロセッサを利用する Sharp MZ シリーズコンピューターですが、ボードとコンセプトは MOS 6502 CPU を使用する BBC Micro Model B などの別のホストアーキテクチャにも容易に使用できます。

FPGA や ASIC の世界では「ソフト」という言葉が文脈から外れて使用されることがよくあります。「ソフト」プロセッサはソフトウェアエミュレーションではなく、HDL で記述されてFPGA にインスタンス化したり ASIC にマスクしたりできる物理的なハードウェアデバイスです。「ソフト」は FPGA に関連するものであり、FPGA(フィールドプログラマブルゲートアレイ)は電子コンポーネントの集まりと相互接続層であり、この相互接続層は RAM のようなもので「1」によって 2 つのコンポーネントがリンクされます。JTAG プログラミングツールまたは FPGA のサポートするプロトコル(シリアルフラッシュ設定デバイスなど)を介して相互接続ビットマップをロードします。デバイスがインスタンス化され相互接続がロードされると、他のハードウェアと同様に動作するため、FPGA 上の「ソフト」プロセッサは実行中は他の「ハード」プロセッサと同じです。

最初に、FPGA に「ソフト」CPU が存在しながら基盤となる Sharp MZ-700 ハードウェアを制御するためのフレームワークを開発するために、T80 プロセッサを組み込むことを選択しました。これは由緒ある Zilog Z80 の再設計であり、文書化および未文書化の命令をすべて実装し、外部使用のための正しいハードウェアシグナルを提示して、ほぼサイクル精度を実現します。この設計は CPLD が双方向ゲートウェイになる必要があったため変更が必要であり、T80 プロセッサと FPGA 内のサポートロジックのインスタンス化も必要でした。最終結果は、Sharp MZ-700 上の FPGA で実行するプロセッサであり、tranZPUter カード上で実行する「ハード」Z80 と同一でした。

フレームワーク設計を支援することを除いて、「ソフト」T80 は研究やプログラムの速度向上のためにアーキテクチャ/命令を変更できること、およびオプションで T80 の拡張「高速」モードを選択できること以外、「ハード」Z80 に対して優位性はありません。実際の Fmax は FPGA/CPLD のスイッチングおよび伝播遅延のために「ハード」Z80 よりも遅く、「ハード」Z80 は 24MHz で実行できますが T80 は 18MHz が上限です。注:RAM が FPGA にインスタンス化されて T80 が tranZPUter カード上のハード 512K スタティック RAM ではなく FPGA BRAM から実行した場合、Sharp MZ シリーズエミュレーターのように最大 120MHz を達成できますが、これはメモリモデルが異なるため制御ソフトウェア(TZFS と 1Z-013A モニター)の再作業が必要になります。

Z80 のテーマを続けて、AZ80 と NextZ80 が評価と比較のためにビルド時の選択肢として追加されました(T80 の代わりに)。AZ80 にはいくつかの軽微な I/O タイミングの問題があり、奇妙なキーボード読み取りが発生することがありますが、テストしたすべての MZ-700 ソフトウェアで完璧に動作します。NextZ80 は Z80 命令互換プロセッサであり、すべての正しいシグナルを提示したり Z80 タイミングサイクルに従ったりしないため、正しく動作させるにはさらに作業が必要です。

2 番目に追加されたプロセッサは ZPU Evolution です。これは Øyvind Harboe(Zylin AS)によって組み込みシステムで監視モードで実行するための最小ロジックサイズ CPU として最初に書かれた 32 ビットスタックベースプロセッサです。設計にはいくつかの拡張(ZPU Flex と ZPUINO が注目されます)がありましたが、どちらも Sharp MZ シリーズエミュレーターへの組み込みに求めるものを提供しなかったため、速度と拡張性を向上させるために再設計して ZPU Evolution を作成しました。

ZPU Evolution は組み込まれることを意図していたため、zOS はこの機能を念頭に置いて書かれました。デバイス内でタスクを実行してその機能を強化し、シリアル接続を介したインタラクティブセッションを提供するための OS です。シリアル接続に接続されたコンソールを使用すると、アプリケーションを実行したり、ハードウェアを制御したり、メモリやプロセスフローを検査/更新したりできる MS-DOS のような環境が提供されます。これは FPGA 内で実行するソフト ZPU Evolution を操作するための理想的なツールであり、Sharp MZ シリーズエミュレーターなどのエンドアプリケーション内で実行していました。tranZPUter SW プロジェクトが誕生したとき、zOS は K64F に移植され、tranZPUter SW と Sharp MZ ホスト内で接続できるようになったことで設計とデバッグに大いに役立ちました。

ZPU Evo を tranZPUter SW-700 の「ソフト」プロセッサとして追加するには zOS の進化が必要でした。シリアル接続がなくなり、キーボードやスクリーンなどを直接制御する必要が生じました。これにより SharpMZ モジュールが追加され、zOS に Sharp MZ-700 のキーボードとスクリーンを駆動するための基本的なハードウェア抽象化レイヤーが提供され、ANSI ターミナルエミュレーターを含む基本的なユーザー I/O 機能が提供されました。ZPU が Sharp MZ-700 モニターから選択されると、zOS が起動してインタラクティブな MS-DOS のような環境が提示されます。tbasic、mbasic、kilo(VT100 ベースのスクリーンエディター)などの基本的なアプリケーションがあり、これらはすべて zOS の apps セクションにあります。想像できるように zOS 上で実行できるソフトウェアはあまり多くありませんが、多くのオープンソースプロジェクトを移植できます。制限要因は GNU C/C++ 99 標準コンパイラまたはスレッド制御や仮想メモリなどの欠けている機能です。

ZPU と zOS は研究開発のためのものであり、エンドユーザー向けではありません。ZPU アーキテクチャの学習、プロセッサや OS の設計に役立つため、エレクトロニクスやコンピューターの学生に大きな恩恵をもたらします。

現在、FPGA にはこのプロセッサとそのサポート回路を実装するためのリソースがあるため、NIOSII プロセッサを MMU と共にインスタンス化することを検討しています。最終結果は Sharp MZ-700 上で実行する Linux となり、はるかに有用なプラットフォームになるでしょう。このページが更新されるまでこれは進行中の作業と考えてください。

CPU 設定レジスタ

CPU 設定レジスタ(0x6C - 10 進数 108)
ビット 方向 説明
5:0 R/W このレジスタは FPGA にソフト/ハード CPU を有効にするよう設定し、CPLD は物理ハードウェア側ではなく FPGA 側での CPU 操作を可能にするよう再設定されます。
同時に選択できるプロセッサは 1 つだけで、プロセッサごとに 1 ビット。複数ビット選択は無効となりハードプロセッサが選択されます。
000000 = ハード CPU
000001 = T80 CPU
000010 = ZPU Evolution
000100 = NIOS11
001000 = 将来の CPU 4
010000 = 将来の CPU 5
100000 = 将来の CPU 6
6 R/W クロック有効。ソフト CPU クロックを有効(1)または無効にします。
7 R/W CPU リセット。アクティブ(’1’)に設定されると、リセットパルスが生成されてビット状態が 0 に戻ります。

FPGA はソフトプロセッサの機能を示す読み取り専用の情報レジスタを保持しています。

CPU 情報レジスタ(0x6D - 10 進数 109)
ビット 方向 説明
5:0 R ビットマスク、1 はプロセッサが利用可能であることを示します。
000000 = ハード CPU のみ
000001 = T80 CPU
000010 = ZPU Evolution
000100 = NIOSII
001000 = 将来の CPU 4
010000 = 将来の CPU 5
100000 = 将来の CPU 6
7:6 R ソフト CPU 機能、01 = ソフト CPU 対応、他のすべての値はソフト CPU 機能が利用不可であることを示します。

ZPU メモリマップ

ZPU には設定可能な線形アドレス空間があり、通常 18〜32 ビット幅です。ソフトプロセッサとして使用する場合は 24 ビットに設定されます。

アドレス範囲 サブ範囲 説明
000000:020000 000000:013FFF zOS カーネル。
  014000:01BFFF ヒープ。
  01C000:01FD7F スタック。
  01FD80:01FFFF I/O プロセッササービス制御レコード。ZPU と K64F 間のプロセッサ間通信に使用され、ZPU が SD カードの読み取りなどのサービスコールを行えるようにします。
100000:180000   tranZPUter ボード上の 512Kbyte 8 ビット幅スタティック RAM。アプリケーションは 0x100000 から始まるこの RAM エリアにロードされて実行されます。
D00000:EFFFFF   Z80 バスステートマシン。アクセスされたアドレスに応じてトランザクションのタイプが決まります。32 ビット読み取り CPU でのバイトレベルアクセスを提供するために、ワードアライメントされたバイトごとのアドレスバンクがワードアライメントされた 32 ビット値の読み取りアドレスに加えて割り当てられています。
  D00000:D7FFFF tranZPUter ボード上の 512K スタティック RAM。すべての読み取りは 32 ビット、すべての書き込みはワード境界で 8、16、または 32 ビット幅。
  D80000:DBFFFF ホストマザーボード上の 64K アドレス空間(RAM/ROM/メモリマップド I/O)に 1 バイトずつアクセス。物理アドレスはバイトごとにワードアライメントされているため、ZPU アドレス空間の 4 バイト = Z80 アドレス空間の 1 バイト(例:0x00780 ZPU = 0x0078 Z80)。
  DC0000:DFFFFF ホストマザーボードまたは基盤となる CPLD/FPGA 上の 64K I/O 空間。64K アドレス空間は Z80 がアキュムレーターを 15:8 に設定してポートを 7:0 に設定することで 64K をアドレスできる機能に対応しています。ZPU は直接アドレスを介してこの機能をミミックし、それを必要とするハードウェアに対応します(例:0x10 をアキュムレーターに持つ 0x3F への書き込みは 0xF103f というアドレスを生成します)。すべての読み取りは 8 ビット、書き込みはワード境界で 8、16、または 32 ビット幅。物理アドレスはバイトごとにワードアライメント(例:0x00780 ZPU = 0x0078 Z80)。
  E00000:E0FFFF ホストマザーボード上の 64K アドレス空間(RAM/ROM/メモリマップド I/O)に 4 バイトずつアクセス。32 ビット読み取りは 4 バイトを連続して返し、読み取りの開始は 32 ビットワード境界上に必要。
  E80000:EFFFFF 512K ビデオアドレス空間 - ビデオプロセッサメモリが ZPU メモリアドレス空間に直接マップされています。詳細はビデオコントローラーダイレクトアクセスモードを参照してください。
  E80000:E8FFFF 64K ビデオ/属性 RAM
  E90000:E9FFFF 64K キャラクタージェネレーター ROM/PCG RAM。
  EA0000:EBFFFF 128K 赤フレームバッファーアドレス空間。
  EC0000:EDFFFF 128K 青フレームバッファーアドレス空間。
  EE0000:EFFFFF 128K 緑フレームバッファーアドレス空間。
F00000:FFFFFF F00800:F008FF 割り込みコントローラー。割り込みコントローラーデバイス間のスペーシング = 0x10。
  F00800:F00803 ステータスレジスタ。
  F00804:F00807 コントロールレジスタ。
  F00900:F009FF SD カードコントローラー。
  F00900:F00903 アドレスレジスタ。
  F00904:F00907 データレジスタ。
  F0090c:F0090f ステータスレジスタ。
  F00C00:F00CFF タイマー。タイマーデバイス間のスペーシング = 0x40。
  F00C00:F00C3F タイマー 0。
  F00C00:F00C03 TIMER_MICROSEC_DOWN - プログラム可能なマイクロ秒ダウンカウンター。
  F00C04:F00C07 TIMER_MILLISEC_DOWN - プログラム可能なミリ秒ダウンカウンター。
  F00C08:F00C0B TIMER_MILLISEC_UP - プログラム可能なミリ秒アップカウンター。
  F00C0C:F00C0F TIMER_SECONDS_DOWN - プログラム可能な秒ダウンカウンター。
  F00C1C:F00C1F RTC_MILLISECONDS_EPOCH - エポックからのリアルタイムミリ秒。
  F00C20:F00C23 RTC_MICROSECONDS - 現在の秒内のリアルタイムマイクロ秒カウント。
  F00C24:F00C27 RTC_MILLISECONDS - 現在の秒内のリアルタイムミリ秒カウント。
  F00C28:F00C2B RTC_SECOND - リアルタイム秒カウント。
  F00C2C:F00C2F RTC_MINUTE - リアルタイム分カウント。
  F00C30:F00C33 RTC_HOUR - リアルタイム時間カウント。
  F00C34:F00C37 RTC_DAY - リアルタイム月内日カウント。
  F00C38:F00C3B RTC_MONTH - リアルタイム年内月カウント。
  F00C3C:F00C3F RTC_YEAR - リアルタイム現在年カウント。
  F00C40:F00C7F タイマー 1 以降、ハードウェアビルド依存。
  F00C40:F00C43 有効レジスタ。
  F00C44:F00C47 インデックスレジスタ。
  F00C48:F00C4b カウンターレジスタ。
  F00F00:F00FFF System on Chip 設定。
  F00F00:F00F03 SOCCFG_ZPU_ID - インスタンス化された ZPU の ID
  F00F04:F00F07 SOCCFG_SYSFREQ - システムクロック周波数(MHz x 10、例:100MHz = 1000)
  F00F08:F00F0B SOCCFG_MEMFREQ - Sysbus SDRAM クロック周波数(MHz x 10、例:100MHz = 1000)
  F00F0C:F00F0F SOCCFG_WBMEMFREQ - Wishbone SDRAM クロック周波数(MHz x 10、例:100MHz = 1000)
  F00F00:F00F03 SOCCFG_DEVIMPL - SOC に実装されたデバイスのビットマップ。
  F00F04:F00F07 SOCCFG_BRAMADDR - ブロック RAM のアドレス。
  F00F08:F00F0B SOCCFG_BRAMSIZE - ブロック RAM のサイズ。
  F00F0C:F00F0F SOCCFG_RAMADDR - RAM のアドレス(追加の BRAM、DRAM など)。
  F00F00:F00F03 SOCCFG_RAMSIZE - RAM のサイズ。
  F00F04:F00F07 SOCCFG_BRAMINSNADDR - 専用命令ブロック RAM のアドレス。
  F00F08:F00F0B SOCCFG_BRAMINSNSIZE - 専用命令ブロック RAM のサイズ。
  F00F0C:F00F0F SOCCFG_SDRAMADDR - SDRAM のアドレス。
  F00F00:F00F03 SOCCFG_SDRAMSIZE - SDRAM のサイズ。
  F00F04:F00F07 SOCCFG_WBSDRAMADDR - Wishbone SDRAM のアドレス。
  F00F08:F00F0B SOCCFG_WBSDRAMSIZE - Wishbone SDRAM のサイズ。
  F00F0C:F00F0F SOCCFG_CPURSTADDR - リセット後に CPU が実行するアドレス。
  F00F00:F00F03 SOCCFG_CPUMEMSTART - CPU の BIOS/マイクロコードを含むメモリの開始アドレス。
  F00F04:F00F07 SOCCFG_STACKSTART - スタック使用のためのメモリの開始アドレス。

ビデオモジュール

ビデオモジュールは、v1.2 ボードでは 76KB 内部 B(lock)RAM と 25K ロジックエレメント(設定可能なロジックゲートのグループ)を持つ Altera Cyclone III FPGA をベースとしています。改良された v1.3 ボードでは、360K/480K と 75K/115K ロジックエレメントを持つ Altera Cyclone IV E75/E115 をベースとしています。

FPGA を使用することで、tranZPUter SW-700 は Sharp MZ シリーズのほぼすべての機種(MZ-80K、MZ-80C、MZ-1200、MZ-80A、MZ-700、MZ-80B(グラフィックス含む))のビデオ機能を提供できます。近い将来、MZ-800 および MZ-2000 機のビデオ機能も追加される予定です。特定機種のビデオ機能を使用するには、後述するモードをモードレジスタに書き込んで機種モデルに応じた必要なビデオ機能を選択し、選択した機種のビデオへの通常のアクセス方法(例:MZ-80A では 0xD000–0xD7FF)を使用します。これには反転やハードウェアスクロール機能などの機能も含まれます。

オリジナルの Sharp MZ シリーズの機能に加え、640x200/320x200 の 8 色グラフィックスフレームバッファが追加されています。このフレームバッファは、640x200 の解像度で色ごとに 3×16K RAM ブロックで構成されており、出力表示バッファとビット単位で一致しています。表示が 40×25 文字で動作している場合の解像度は 320x200 で、80×25 の場合は 640x200 となります。

640x200 モード(Cyclone III のみの制限)を除くすべてのモードでは、ディスプレイはダブルバッファリングされており、画像はスクリーン表示のレンダリングに使用されるバッファとは別のバッファに組み立てられます。640x200 モードでは Cyclone III FPGA のメモリ不足によりダブルバッファリングが行われないため、必要に応じてスクリーンのちらつき/テアリングを防止するためのオプションのウェイトステートジェネレーターを有効にすることができます。ビデオロジック設計が引用された Sharp MZ シリーズエミュレーター同様、Cyclone IV は十分な RAM を持ちダブルバッファリングが可能です。

グラフィックスフレームバッファ用 RAM は、プログラマブルレジスタにより 1 バンクずつ(赤、緑、青バンク)メイン CPU アドレス範囲 C000H–FFFFH に切り替えることができます。これにより CPU が直接アドレス指定できるピクセルの読み書きが可能になります。各ピクセルは 1 バイト単位でバイト内は右から左、行は左から右、上から下の順に格納されます。たとえば、赤バンクが CPU アドレス空間にマップされている場合、C000H のバイトは 320/640(X)のピクセル 7~0、200(Y)のピクセル 0 の赤ピクセルを表します。したがって 01H を C000H に書き込むとピクセル 7(X)、行 0(Y)がオンになり、80H を C000H に書き込むとピクセル 0(X)、行 0(Y)がオンになります。これは緑および青バンクが CPU アドレス空間にマップされている場合も同様です。

表示速度を向上させるため、(Sharp MZ-2500 で利用可能なものと同様の)カラーライトレジスタがあり、グラフィックス RAM への書き込みで 3 つのバンクを同時に更新することができ、即時カラー書き込みが可能です。

プログラマブルレジスタ

ビデオ機能を利用するために、すべての機能にアクセスできるレジスタセットが設計されています。

機能は以下のようにグループ化されています:

  • 制御 - ビデオ機能モードの設定、列幅の設定、カラー/モノクロ機能の設定。
  • グラフィックス - グラフィックス機能の設定。
  • GPU - ビデオ処理を高速化するため内蔵グラフィックスプロセッサにタスクをオフロード。
  • パレット - 表示パレットの設定と構成。

レジスタは上位 I/O 領域の 0xD0〜0xFD にあり、標準の Z80 I/O コマンド IN/OUT でアクセスします。特に明記されていない限り、すべてのレジスタは読み書き可能で、読み出すと現在格納されている値が返されます。

制御レジスタ(0xA8 - 10進数 168)

これはビデオモードレジスタです。ビデオモジュールが動作するハードウェアモデルのほか、出力表示の列幅とカラー機能を指定します。

ビット 方向 説明
2:0 R/W ビデオモジュールのハードウェアモデルを設定。
000 = MZ-80K
001 = MZ-80C
010 = MZ-1200
011 = MZ-80A
100 = MZ-700
101 = MZ-800
110 = MZ-80B
111 = MZ-2000
3 R/W ビデオ出力の列幅を設定。0 = 40 列、1 = 80 列
4 R/W ビデオ出力のカラー機能を設定。0 = モノクロ、1 = カラー。
5 R/W プログラマブルキャラクタジェネレーター RAM を有効化。0 = 無効、1 = 有効。
7:6 R/W VGA モードを設定。
00 = オリジナル MZ ビデオフォーマット、水平 15.62KHz × 垂直 60Hz。
01 = VGA 640x480 @ 60Hz
10 = VGA 1024x768 @ 60Hz
11 = VGA 800x600 @ 60Hz。
グラフィックスモードレジスタ(0xA9 - 10進数 169)

これはグラフィックスモード制御レジスタです。出力するビデオの内容、合成方法、読み書き可能なグラフィックス RAM バンクを指定します。

ビット 方向 説明
1:0 R/W 読み出しモード(00=赤バンク、01=緑バンク、10=青バンク、11=未使用)。CPU アドレス空間で有効時に読み出すバンクを選択。
3:2 R/W 書き込みモード(00=赤バンク、01=緑バンク、10=青バンク、11=間接)。CPU アドレス空間で有効時に書き込むバンクを選択。
4 R/W VRAM 出力。0=有効、1=無効。キャラクター RAM を表示に出力。
5 R/W GRAM 出力。0=有効、1=無効。グラフィックス RAM を表示に出力。
7:6 R/W ブレンド演算子(00=OR、01=AND、10=NAND、11=XOR)。キャラクター表示とグラフィックス表示を合成する演算子。
カラーライターレジスタ(0xAA - 10進数 170 ~ 0xAC - 10進数 172)
カラーライターレジスタは、間接書き込み(つまり 3 つのカラーページを一度に)の際に各カラーフレームバッファに適用されるビットマップです。

間接モード(制御レジスタのビット 3/2 が 11 に設定)では、CPU アドレス空間 C000H–FFFFH にマップされているグラフィックス RAM への書き込みにより、バイトが赤カラーライターレジスタでマスクされ赤バンクに書き込まれます。緑と青についても同様の処理が行われます。これにより 3 つのバンクにわたって色を高速に設定できます。

例:赤フィルター = 0x80、緑フィルター = 0x40、青フィルター = 0x20 の場合、アドレス C000H への間接書き込みにより、ピクセル 0,0 が赤、1,0 が緑、2,0 が青に設定されます。

ビット 方向 ピクセル I/O アドレス 説明
0 R/W 7 0xAAH 間接書き込み時に赤に設定。
1 R/W 6 0xAAH  
2 R/W 5 0xAAH  
3 R/W 4 0xAAH  
4 R/W 3 0xAAH  
5 R/W 2 0xAAH  
6 R/W 1 0xAAH  
7 R/W 0 0xAAH 間接書き込み時に赤に設定。
0 R/W 7 0xABH 間接書き込み時に緑に設定。
1 R/W 6 0xABH  
2 R/W 5 0xABH  
3 R/W 4 0xABH  
4 R/W 3 0xABH  
5 R/W 2 0xABH  
6 R/W 1 0xABH  
7 R/W 0 0xABH 間接書き込み時に緑に設定。
0 R/W 7 0xACH 間接書き込み時に青に設定。
1 R/W 6 0xACH  
2 R/W 5 0xACH  
3 R/W 4 0xACH  
4 R/W 3 0xACH  
5 R/W 2 0xACH  
6 R/W 1 0xACH  
7 R/W 0 0xACH 間接書き込み時に青に設定。
メモリページレジスタ(0xAD - 10進数 173)

このレジスタは、ビデオメモリを Z80 アドレス空間に有効化する役割を担います。グラフィックスモードレジスタで選択した 3 色のうち 1 つの 16KB GRAM を Z80 アドレス C000:FFFF に、または CGROM を Z80 アドレス空間 D000:DFFF に有効化することができます。このレジスタは他のすべてのメモリページ設定を上書きします。

ビット 方向 説明
0 R/W 16KB グラフィックス RAM バンクを C000–FFFF に切り替え。バンク(または色)はグラフィックスモードレジスタで選択。
0 = オフ、通常の Z80 メモリ操作。
1 = 16KB GRAM 有効。
このレジスタの設定は MZ-700/MZ-80B 固有のすべてのメモリページ設定を上書きします。
7 R/W CGROM を D000:DFFF でアップロード用に切り替え。0 = 通常メモリ操作、1 = CGROM ページイン。
ビデオモジュールステータスレジスタ(0xAD - 10進数 173)

このレジスタはビデオモジュールのステータスを報告します。ビット 7 と 0 はメモリページレジスタ設定の報告用に予約されています。

ビット 方向 説明
5 R フレームバッファ水平ブランキング。1 = 水平ブランキング有効、0 = 水平ブランキングなし。
6 R フレームバッファ垂直ブランキング。1 = 垂直ブランキング有効、0 = 垂直ブランキングなし。
GPU パラメーターレジスタ(0xB2 - 10進数 178)
このレジスタは、GPU コマンドで使用するパラメーターを格納するための 128 ビットのプッシュ/ポップレジスタです。実際の内容は発行されたコマンドによって異なります(後述の GPU コマンド説明を参照)。このレジスタへのプッシュごとに現在の 128 ビットが左に 8 ビットシフトされ、新しい値がビット 7:0 に格納されます。

このレジスタからの読み出しではビット 7:0 がポップされ、レジスタが右に 8 ビットシフトされます。
GPU コマンドレジスタ(0xB3 - 10進数 179)
FPGA は基本的なグラフィックスプロセッシングユニットを実装しており、今後機能が拡張される予定です。現在実行できるコマンドは以下の表の通りです。GPU を使用するには、まず GPU パラメーターレジスタ(I/O ポート 0xF6)を通じて必要なパラメーターをパラメーターレジスタにプッシュします。次にコマンドを発行し、完了を待つためにステータスフラグをポーリングします。

コマンド パラメーター 説明
0x00 なし 操作なし。これは GPU がビジーでないときのアイドル状態コマンドで、発行しても何も行いません。
0x01 なし VRAM 画面クリア。ビデオおよびアトリビュート RAM 全体をスペース文字(つまり空白)で、青背景に白文字としてクリアします。
0x02 [15:8] - キャラクター
[7:0] - アトリビュートバイト
文字とアトリビュートで VRAM 画面クリア。ビデオおよびアトリビュート RAM 全体をパラメーターリストで指定された値にクリアします。
0x03 [47:40] - 開始 X
[39:32] - 開始 Y
[31:24] - 終了 X
[23:16] - 終了 Y
[15:8] - 表示文字
[7:0] - アトリビュートバイト。
ビデオおよびアトリビュート RAM の一部を指定された文字とアトリビュート値にクリアします。開始 X/Y から終了 X/Y までの領域が対象です。
0x81 なし 16KB フレームバッファ(赤/緑/青)全体をクリアします。
0x82 [87:72] - 開始 X
[71:56] - 開始 Y
[55:40] - 終了 X
[39:24] - 終了 Y
[23:16] - 赤フィルター
[15:8] - 緑フィルター
[7:0] - 青フィルター
R/G/B フィルターは 8 ピクセル幅、ビット 7 が左端のピクセル。
指定されたパラメーターに従って 16KB フレームバッファ(赤/緑/青)の一部をクリアします。クリア領域は開始 X/Y から終了 X/Y まで、フィルターは値に応じてこの領域のピクセルを設定します。1 = 対応するピクセルを設定、0 = 対応するピクセルをクリア。
0xFF なし GPU をリセット。実行中の操作をキャンセルしてすぐにアイドル状態に戻ります。
GPU ステータスレジスタ(0xB3 - 10進数 179)

このレジスタは現在の GPU ステータスを返し、新しいコマンドを要求する前にポーリングする必要があります。

ビット 方向 機能 説明
0 R BUSY GPU のビジー状態を示すフラグ。1 = ビジー、0 = アイドル。ビジー時は GPU がアイドル状態に戻るまで新たなコマンドは処理されません(ただし RESET コマンドは即座に実行されます)。
VGA ボーダー領域およびアトリビュートレジスタ(0xBE - 10進数 190)

VGA モードでは、グラフィックス RAM/VRAM の拡大が通常は空白のままにされる表示領域全体を完全には埋めません。このレジスタを使用することで、必要に応じて異なる色を適用できるようアトリビュートを設定できます。

ビット 方向 説明
2:0 R/W ボーダー色を設定。
2: = 赤
1: = 緑
0: = 青
6 R/W OSD メニューオーバーレイを有効化
1: = 有効
0: = 無効
7 R/W 未使用スクリーン領域の OSD ステータス表示エリアを有効化。
1: = 有効
0: = 無効
VGA モードレジスタ(0xBF - 10進数 191)

VGA モードレジスタ。外部ディスプレイの出力解像度と周波数を設定します。

ビット 方向 説明
3:0 R/W VGA 出力モードを設定。
0: = オリジナル Sharp 60Hz モード
1: = ヨーロッパ Sharp 50Hz モード
2: = 640x480 @ 60Hz
3: = 800x600 @ 60Hz。
パレット選択レジスタ(0xB0 - 10進数 176)
このレジスタは使用するアクティブパレットを選択します。ビデオモジュールは色出力に 4 ビット(tranZPUter SW-700 では 5 ビット)をサポートしていますが、1 色当たり 1 ビット分の RAM しかないため、パレットを使用して出力する色を変更します。

256 個のパレットがあり、0 はシステムカラーのデフォルト、1〜255 は FPGA HDL コンパイル時に固定されたパレットです。パレットは後述のパレット設定レジスタを通じて再プログラムできます。

tranZPUter SW-700 では、ビット 4 はビット 3:0 の色に対するサブカラーのシェードを選択します。ハードウェアはオリジナルモードではビット 4 を使ってデジタル出力を駆動し、FPGA モードでは 1 に設定するとサブカラーのセットを選択し、0 にすると標準 RGB 3:0 カラーを選択するよう設定できます。
パレット設定オフポインターレジスタ(0xA3 - 10進数 163)

このレジスタは、ピクセル(R/G/B)がオフ状態の場合に設定するパレット番号を設定します。つまり、ピクセルがオフのときに出力される色です。このレジスタへの書き込みは、実際のパレット色レジスタへの書き込みの前に行います。

パレット設定オンポインターレジスタ(0xA4 - 10進数 164)

このレジスタは、ピクセル(R/G/B)がオン状態の場合に設定するパレット番号を設定します。つまり、ピクセルがオンのときに出力される色です。このレジスタへの書き込みは、実際のパレット色レジスタへの書き込みの前に行います。

パレット赤値設定レジスタ(0xA5 - 10進数 165)

このレジスタは、オフ/オンポインターレジスタで選択したパレットで使用する 5 ビットの赤値を設定します。

パレット緑値設定レジスタ(0xA6 - 10進数 166)

このレジスタは、オフ/オンポインターレジスタで選択したパレットで使用する 5 ビットの緑値を設定します。

パレット青値設定レジスタ(0xA7 - 10進数 167)

このレジスタは、オフ/オンポインターレジスタで選択したパレットで使用する 5 ビットの青値を設定します。

ビデオモードパラメーター設定レジスタ(0xA0 - 10進数 160)
このレジスタを使用して現在のビデオモードパラメーターを変更することができます。変更するパラメーターの番号をこのレジスタに書き込み、8/16 ビットの値を下位/上位パラメーターバイトレジスタに書き込みます。

以下の表は現在のビデオモードとパラメーター番号の概要です。アクティブモードは制御レジスタで設定され、パラメーターはビデオモードパラメーターレジスタを通じて更新できます。

フロントポーチは XXX_SYNC_START パラメーターに含まれます。バックポーチは XXX_LINE_END に含まれます。つまり、XXX_LINE_END - XXX_SYNC_END = バックポーチとなります。

  パラメーター番号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  
モード 説明 H_DSP_START H_DSP_END H_DSP_WND_START H_DSP_WND_END H_MNU_START H_MNU_END H_HDR_START H_HDR_END H_FTR_START H_FTR_END V_DSP_START V_DSP_END V_DSP_WND_START V_DSP_WND_END V_MNU_START V_MNU_END V_HDR_START V_HDR_END V_FTR_START V_FTR_END H_LINE_END V_LINE_END MAX_COLUMNS H_SYNC_START H_SYNC_END V_SYNC_START V_SYNC_END H_POLARITY V_POLARITY H_PX V_PX
0 MZ80K/C/1200/A 機はモノクロ 60Hz 表示、スキャン 512×260、表示可能領域 320x200。 0 320 0 320 32 288 0 0 0 0 0 0 200 0 36 164 0 0 0 0 511 259 40 320 + 43 320 + 43 + 45 200 + 19 200 + 19 + 4 0 0 0 0
1 MZ80K/C/1200/A 機の適応モノクロ 60Hz 表示、スキャン 1024×260、表示可能領域 640x200。 0 640 0 640 192 448 0 0 0 0 0 200 0 200 36 164 0 0 0 0 1023 259 80 640 + 106 640 + 106 + 90 200 + 19 200 + 19 + 4 0 0 0 0
2 MZ80K/C/1200/A 機の MZ700 スタイルカラー 60Hz 表示、スキャン 512×260、表示可能領域 320x200。 0 320 0 320 32 288 0 0 0 0 0 200 0 200 36 164 0 0 0 0 567 259 40 320 + 80 320 + 80 + 40 200 + 19 200 + 19 + 4 0 0 0 0
3 MZ80K/C/1200/A 機の MZ700 スタイルカラー 60Hz 表示、スキャン 1024×260、表示可能領域 640x200。 0 640 0 640 192 448 0 0 0 0 0 200 0 200 36 164 0 0 0 0 1135 259 80 640 + 160 640 + 160 + 80 200 + 19 200 + 19 + 4 0 0 0 0
4 モード 0 を 640x480 @ 60Hz タイミングにアップスケール(40 文字モードモノクロ)。 0 640 0 640 64 576 0 640 0 640 0 480 48 448 111 367 0 39 440 479 799 524 40 640 + 16 640 + 16 + 96 480 + 8 480 + 8 + 2 0 0 1 1
5 モード 1 を 640x480 @ 60Hz タイミングにアップスケール(80 文字モードモノクロ)。 0 640 0 640 64 576 0 640 0 640 0 480 48 448 111 367 0 39 440 479 799 524 80 640 + 16 640 + 16 + 96 480 + 8 480 + 8 + 2 0 0 0 1
6 モード 2 を 640x480 @ 60Hz タイミングにアップスケール(40 文字モードカラー)。 0 640 0 640 64 576 0 640 0 640 0 480 48 448 111 367 0 39 440 479 799 524 40 640 + 16 640 + 16 + 96 480 + 11 480 + 11 + 2 0 0 1 1
7 モード 3 を 640x480 @ 60Hz タイミングにアップスケール(80 文字モードカラー)。 0 640 0 640 64 576 0 640 0 640 0 480 48 448 111 367 0 39 440 479 799 524 80 640 + 16 640 + 16 + 96 480 + 8 480 + 8 + 2 0 0 0 1
8 モード 0 を 800x600 @ 60Hz タイミングにアップスケール(40 文字モードモノクロ)。 0 800 80 720 64 576 0 0 0 0 0 600 0 600 111 367 0 0 0 0 1055 627 40 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 1 2
9 モード 1 を 800x600 @ 60Hz タイミングにアップスケール(80 文字モードモノクロ)。 0 800 80 720 64 576 0 0 0 0 0 600 0 600 111 367 0 0 0 0 1055 627 80 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 0 2
10 モード 2 を 800x600 @ 60Hz タイミングにアップスケール(40 文字モードカラー)。 0 800 80 720 64 576 0 0 0 0 0 600 0 600 111 367 0 0 0 0 1055 627 40 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 1 2
11 モード 3 を 800x600 @ 60Hz タイミングにアップスケール(80 文字モードカラー)。 0 800 80 720 64 576 0 0 0 0 0 600 0 600 111 367 0 0 0 0 1055 627 80 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 0 2
12 MZ80K/C/1200/A 機はモノクロ 60Hz 表示、スキャン 512×260、表示可能領域 320x200。 0 320 0 320 32 288 0 0 0 0 0 0 200 0 36 164 0 0 0 0 511 259 40 320 + 43 320 + 43 + 45 200 + 19 200 + 19 + 4 0 0 0 0
13 MZ80K/C/1200/A 機の適応モノクロ 60Hz 表示、スキャン 1024×260、表示可能領域 640x200。 0 640 0 640 192 448 0 0 0 0 0 200 0 200 36 164 0 0 0 0 1023 259 80 640 + 106 640 + 106 + 90 200 + 19 200 + 19 + 4 0 0 0 0
14 MZ80K/C/1200/A 機の MZ700 スタイルカラー 50Hz 表示、スキャン 568×312、表示可能領域 320x200。 0 320 0 320 32 288 0 0 0 0 0 200 0 200 36 164 0 0 0 0 567 311 40 320 + 80 320 + 80 + 40 200 + 50 200 + 50 + 3 0 0 0 0
15 MZ80K/C/1200/A 機の MZ700 スタイルカラー 50Hz 表示、スキャン 1136×312、表示可能領域 640x200。 0 640 0 640 192 448 0 0 0 0 0 200 0 200 36 164 0 0 0 0 1135 311 80 640 + 160 640 + 160 + 80 200 + 50 200 + 50 + 3 0 0 0 0
16 MZ-2000 内部モニター 40 列モード。 0 320 0 320 32 288 0 0 0 0 0 200 0 200 36 164 0 0 0 0 511 259 40 320 + 43 320 + 43 + 45 200 + 19 200 + 19 + 4 0 0 0 0
17 MZ-2000 内部モニター 80 列モード。 0 640 0 640 192 448 0 0 0 0 0 200 0 200 36 164 0 0 0 0 1023 259 80 640 + 106 640 + 106 + 90 200 + 19 200 + 19 + 4 0 0 0 0
凡例:
    H_DSP_START = 水平表示領域の開始。つまり、指定モードの物理的な表示領域。
    H_DSP_END = 水平表示領域の終了。
    H_DSP_WND_START = 水平表示ウィンドウの開始。つまり、データが出力される実際の表示領域。
    H_DSP_WND_END = 水平表示ウィンドウの終了。
    H_MNU_START = 水平表示メニューオーバーレイ領域の開始。
    H_MNU_END = 水平表示メニューオーバーレイ領域の終了。
    H_HDR_START = ステータス情報に使用される未使用表示領域上部の水平表示開始。
    H_HDR_END = ステータス情報に使用される未使用表示領域上部の水平表示終了。
    H_FTR_START = ステータス情報に使用される未使用表示領域下部の水平表示開始。
    H_FTR_END = ステータス情報に使用される未使用表示領域下部の水平表示終了。
    V_DSP_START = 垂直表示領域の開始。
    V_DSP_END = 垂直表示領域の終了。
    V_DSP_WND_START = 垂直表示領域ウィンドウの開始。
    V_DSP_WND_END = 垂直表示領域ウィンドウの終了。
    V_MNU_START = 垂直表示メニューオーバーレイ領域の開始。
    V_MNU_END = 垂直表示メニューオーバーレイ領域の終了。
    V_HDR_START = ステータス情報に使用される未使用表示領域上部の垂直表示開始。
    V_HDR_END = ステータス情報に使用される未使用表示領域上部の垂直表示終了。
    V_FTR_START = ステータス情報に使用される未使用表示領域下部の垂直表示開始。
    V_FTR_END = ステータス情報に使用される未使用表示領域下部の垂直表示終了。
    H_LINE_END = 水平ライン終了、つまり最後の水平ピクセル。
    V_LINE_END = 垂直ライン終了、最後の垂直ピクセル。
    MAX_COLUMNS = 最大キャラクター表示列数。
    H_SYNC_START = 水平同期開始。
    H_SYNC_END = 水平同期終了。
    V_SYNC_START = 垂直同期開始。
    V_SYNC_END = 垂直同期終了。
    H_POLARITY = 水平同期極性、0 = 負、1 = 正。
    V_POLARITY = 垂直同期極性、0 = 負、1 = 正。
    H_PX = 水平ピクセル倍増、つまり 1x、2x、4x など。
    V_PX = 垂直ピクセル倍増、つまり 1x、2x、4x など。

ビデオモード下位パラメーターバイト設定レジスタ(0xA1 - 10進数 161)

このレジスタは、ビデオモードパラメーターレジスタで選択したパラメーターの下位バイトを書き込むために使用します。たとえば、パラメーター 0 が設定されている場合、このレジスタへの書き込みにより H_DSP_START パラメーターの下位バイトが更新されます。

ビデオモード上位パラメーターバイト設定レジスタ(0xA2 - 10進数 162)

このレジスタは、ビデオモードパラメーターレジスタで選択したパラメーターの上位バイトを書き込むために使用します。たとえば、パラメーター 0 が設定されている場合、このレジスタへの書き込みにより H_DSP_START パラメーターの上位バイトが更新されます。

ダイレクトアクセスモード

ビデオコントローラーは、CPLD メモリマネージャーを経由しない 24 ビットアドレスを使用したダイレクトアクセスモードを備えています。このモードは K64F I/O プロセッサーまたは FPGA 上にインスタンス化されたソフトプロセッサーで使用できます。以下の表で Y はアドレスオフセットを指し、ZPU 構成では 0xE00000 となります。

アドレス範囲 A23 - A16 A15 - A8 A7 - A0 MZ アドレス 説明
Y+0x000000 00000000       通常の Sharp MZ の動作
Y+0x200000 00100000       メモリおよび I/O ポートをダイレクトアドレス指定可能なメモリ位置にマップ。
          I/O レジスタは I/O アドレスをミラーリングする下位 256 バイトにマップされる。
Y+0x2000A0   00000000 10100000 0xA0 更新するパラメーター番号を設定。
    00000000 10100001 0xA1 選択したパラメーターの下位バイトを更新。
    00000000 10100010 0xA2 選択したパラメーターの上位バイトを更新。
    00000000 10100011 0xA3 調整するパレットスロットのオフ位置を設定。
    00000000 10100100 0xA4 調整するパレットスロットのオン位置を設定。
    00000000 10100101 0xA5 PALETTE_PARAM_SEL アドレスに従って赤パレット値を設定。
    00000000 10100110 0xA6 PALETTE_PARAM_SEL アドレスに従って緑パレット値を設定。
Y+0x2000A7   00000000 10100111 0xA7 PALETTE_PARAM_SEL アドレスに従って青パレット値を設定。
Y+0x2000B0   00000000 10110000 0xB0 パレットを設定。
Y+0x2000B1   00000000 10110001 0xB1 VGA ボーダー色を設定。
    00000000 10110010 0xB2 パラメーターを設定。
    00000000 10110011 0xB3 グラフィックスプロセッサユニットコマンドを設定。
    00000000 10111000 0xB8 ビデオモードを設定。
    00000000 10111001 0xB9 グラフィックスモードを設定。
    00000000 10111010 0xBA 赤ビットマスクを設定
    00000000 10111011 0xBB 緑ビットマスクを設定
    00000000 10111100 0xBC 青ビットマスクを設定
Y+0x2000BD   00000000 10111101 0xBD ブロック C000:FFFF のビデオメモリページを設定
           
Y+0x2000E0   00000000 11100000 0xE0 MZ80B PPI
    00000000 11100100 0xE4 MZ80B PIT
Y+0x2000E8   00000000 11101000 0xE8 MZ80B PIO
           
    00000000 11110000 0xF0  
    00000000 11110001 0xF1  
    00000000 11110010 0xF2  
Y+0x2000F3   00000000 11110011 0xF3  
    00000000 11110100 0xF4 MZ80B のビデオ入出力モードまたは MZ2000 カラー CRT 背景色選択を設定。
    00000000 11110101 0xF5 MZ2000 優先度。ビット 3 = 0 でキャラクターが前景に、= 1 でグラフィックスが前景に。2:0 = 色
    00000000 11110110 0xF6 MZ2000 ビット 4 CRT へのグラフィックス表示(H)、2:0 色 VRAM のカラー CRT / CRT への有効化(有効時)。
    00000000 11110111 0xF7 メモリマップ有効時の VRAM バンク選択。0 = なし、1 = 青、2 = 赤、3 = 緑
           
          メモリレジスタはベース機と同様に E000 領域にマップされる。
Y+0x20E010   11100000 00010010   キャラクタージェネレーター RAM のプログラム。E010 - 書き込みサイクル(読み出しサイクル = メモリスワップリセット)。
    11100000 00010100   通常表示選択。
    11100000 00010101   反転表示選択。
    11100010 00000000   スクロール表示レジスタ。E200 - E2FF
Y+0x20E2FF   11111111      
           
Y+0x210000 00100001       ビデオ/アトリビュート RAM。64K ウィンドウ。
Y+0x21D000   11010000 00000000   ビデオ RAM
Y+0x21D7FF   11010111 11111111    
Y+0x21D800   11011000 00000000   アトリビュート RAM
Y+0x21DFFF   11011111 11111111    
           
Y+0x220000 00100010       キャラクタージェネレーター RAM
Y+0x220000   00000000 00000000   CGROM
Y+0x220FFF   00001111 11111111    
Y+0x221000   00010000 00000000   CGRAM
Y+0x221FFF   00011111 11111111    
           
Y+0x240000 00100100       赤フレームバッファ。
    00000000 00000000   赤ピクセルアドレス指定フレームバッファ。下位 8K に MZ-80B GRAM I メモリも含む
Y+0x243FFF   00111111 11111111    
Y+0x250000 00100101       青フレームバッファ。
    00000000 00000000   青ピクセルアドレス指定フレームバッファ。下位 8K に MZ-80B GRAM II メモリも含む
Y+0x253FFF   00111111 11111111    
Y+0x260000 00100110       緑フレームバッファ。
    00000000 00000000   緑ピクセルアドレス指定フレームバッファ。
Y+0x263FFF   00111111 11111111    
Y+0x270000 00010111       青メニュー/ステータスフレームバッファ。
Y+0x271FFF   00011111 11111111    
Y+0x280000 00011000       赤メニュー/ステータスフレームバッファ。
Y+0x281FFF   00011111 11111111    
Y+0x290000 00011001       緑メニュー/ステータスフレームバッファ。
Y+0x291FFF   00011111 11111111    
Y+0x2A0000 00011010       赤/緑/青メニュー/ステータスフレームバッファ(書き込み専用)。
Y+0x291FFF   00011111 11111111    

互換性モード

tranZPUter SW-700 は、Sharp MZ-80A ベースの tranZPUter SW + ビデオモジュール v2.0 の発展版です。Sharp MZ-80A では、Sharp MZ-700 のソフトウェアをできる限り実機に近い形で実行できるようにすることが求められていました。これは、MZ-80A 上で動作する MZ-700 ソフトウェアが MZ-700 ハードウェアを認識できるよう、ハードウェアレベルでハードウェアの差異をマッピングする CPLD を使用することで実現しました。このハードウェアリマッピングは互換性モードと呼ばれます。

互換性モードは CPLD では提供されなくなり、Sharp MZ シリーズ FPGA エミュレーションロジックを通じて提供されるようになりました。これは、FPGA が組み込み I/O プロセッサーと組み合わせた FPGA と物理ホストハードウェアの組み合わせを使用して、エミュレーション制御用のユーザーインターフェースメニューシステムを提供することで、完全な Sharp MZ シリーズエミュレーションを実現するためのすべてのロジックを含んでいる場所です。

詳細については Sharp MZ シリーズ FPGA エミュレーションの個別セクションを参照してください。

ハードウェア記述言語

tranZPUter SW-700 は CPLD(Complex Logic Device、複合論理デバイス)と FPGA(Field Programmable Gate Array、フィールドプログラマブルゲートアレイ)を多用しています。これらのデバイスは回路を形成するために相互接続が必要なハードウェア論理素子の配列です。これらのデバイスを構成するにはビットマップが必要で、CPLD/FPGA にアップロードすることで配列を設定し、必要な回路を形成します。

ビットマップを作成する方法はさまざまありますが、一般的にはソフトウェアソースコードに似たハードウェア記述言語が使用されます。私は大学で学んだ ADA に基づく VHDL を使用することを選択しました。Verilog や System Verilog も使用したことがあり、これらの言語も優れていると感じており、実際に Sharp MZ シリーズ FPGA エミュレーションで使用していますが、このプロジェクトでは VHDL が HDL の選択です。

CPLD と FPGA はどちらも Sharp MZ シリーズ FPGA エミュレーション HDL(Intel/Altera Cyclone V を使用)の容易な再利用に基づいて選択されたため、同メーカーの製品を使い続けることが合理的でした。CPLD は 512 マクロセルの MAX 7000A デバイスで、より新しいデバイスには見られない 5V 耐性能力があり、Sharp MZ-700 信号を読み取るための追加の電圧変換回路が不要なことから選ばれました。FPGA は価格/パッケージ/機能の要件に基づいて選択され、デバイスが(当初は)BGA でないこと、少なくとも 64K の内部ブロック RAM を必要とする既存の Sharp MZ シリーズ FPGA エミュレーションビデオロジック HDL を組み込めることが条件でした。tranZPUter SW-700 の v1.2 では Cyclone III EP3C25 デバイスを採用しましたが、Sharp MZ シリーズ FPGA エミュレーション HDL を使用するにはメモリが十分でないものの、いくらかの修正後は完全に許容可能です。改良された v1.3 ボードでは大幅に多くのリソースを持つ Cyclone IV EP4CE75 が選ばれました。

複合論理デバイス - MAX 7000A

CPLD は、オリジナルの tranZPUter SW にある個別ロジックとフラッシュ RAM デコーダーに置き換わるものです。Sharp MZ-700 からの Z80 信号と tranZPUter Z80 アップグレードロジックに直接インターフェースします。その目的は以下を提供することです。

  • Z80 メモリマップデコーディング
  • Z80 バス制御
  • FPGA 内部のプロセッサーが基盤となるホストハードウェアを制御できる双方向バス制御。
  • ウェイトステート生成
  • ハードウェアリマッピング
  • 電圧変換

CPLD 構成を形成するソースファイルは以下の通りです:

モジュール 説明
<host>/tranZPUterSW700_TopLevel.vhd トップレベル設計ファイル。回路のルートスキーマティックに相当します。CPLD に入力されるメインコンポーネント信号とその使用方法をレイアウトします。
<host>/tranZPUterSW700_pkg.vhd 関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
<host>/tranZPUterSW700.vhd メイン設計ファイル。ターゲット回路内の CPLD 内でゲートとワイヤーの相互接続を形成するためのすべてのロジックを含みます。
<host>/build/tranZPUterSW700.qpf Quartus Prime がプロジェクトとそのすべてのファイルを宣言するために使用するプロジェクトファイル。
<host>/build/tranZPUterSW700.qsf 定義および割り当てファイル。コンパイル、フィッティング、使用するピンとその名前・パラメーターなどすべてのパラメーターを設定します。このファイルは Quartus Prime によって作成されますが、Quartus Prime GUI を使うよりも手作業で変更する方が早い場合もあります。
<host>/build/tranZPUterSW700_constraints.sdc Time Quest タイミング解析ツールが作成・使用するタイミング制約ファイル。コンパイラとフィッターが CPLD 内のコンポーネント配置を決定する際にも使用されます。

<host> = MZ700 - Sharp MZ-700 ホスト上で動作する tranZPUter SW-700 用 HDL。
               = MZ2000 - Sharp MZ-2000 ホスト上で動作する tranZPUter SW-700 用 HDL。

CPLD ビットストリームのビルド

VHDL コードを CPLD にアップロード可能なビットストリームにビルドまたはコンパイルするには、Altera の Quartus Prime v13.0.1 を使用する必要があります。これは優れたソフトウェアであり、Web エディションは無料でダウンロードして使用できます。最新の Altera 製品を除くすべての製品の開発に適しています。

Quartus Prime を Windows/Linux ワークステーションにインストールするか、以下に説明する Docker イメージを作成することができます。さまざまな Linux ディストリビューションへの複数回のインストール経験から、Docker の使用がこの複雑なパッケージを使用する最も簡単な方法です。

コンパイル:

   1. Quartus Prime v13.0.1 を起動します(ローカルインストールまたは Docker イメージ)。
   2. 'File->Open Project' に移動し、リポジトリのクローンが保存されているディレクトリを検索して、<Clone Path>/tranZPUter/CPLD/build/tranZPUterSW700.qpf のファイルを選択します。これにより CPLD tranZPUter SW-700 プロジェクトが開きます。
   3. 'Processing->Start' コンパイルを選択します - 警告メッセージは無視して構いません。
   4. 完了すると、<Clone Path>/tranZPUter/CPLD/build/output_files ディレクトリに tranZPUterSW700.sof という名前のビットストリームが作成されます。

プログラミング:

   1. CPLD にビットストリームをアップロードするには、tranZPUter SW-700 ボードの 10 ピン JTAG IDC コネクターに USB ポートで接続した Altera USB Blaster が必要です。
   2. Quartus Prime で 'Tools->Programmer' に移動すると、新しいプログラマーウィンドウが起動します。
   3. プログラマーウィンドウで 'Hardware Setup' をクリックして USB アダプターを選択し、'Close' をクリックします。
   4. 'Auto Detect' をクリックすると、EPM7512AET144、EP3C25E144、EPCS16 の 3 つのデバイスが見つかるはずです。
   5. EPM7512AET144 デバイスを右クリックし、Add File を選択して <Clone Path>/tranZPUter/CPLD/build/output_files/tranZPUterSW700.sof にある sof ファイルを選択し、Open をクリックします。
   6. EPM7512AET144 に対して 'Program/Configure' と 'Verify' のチェックボックスを選択します。
   7. 'Start' をクリックすると、CPLD にコンパイル済みビットストリームがプログラムされます。

フィールドプログラマブルゲートアレイ

最初にリリースされた tranZPUter SW-700 設計のバージョン 1.2 は 25K ロジックエレメントの Cyclone III デバイスを使用しており、Sharp MZ シリーズビデオハードウェアを完全にエミュレートするすべての機能と将来の拡張のための容量を提供しました。

tranZPUter SW-700 設計の第 2 リリースであるバージョン 1.3 は、75K/115K ロジックエレメントの Cyclone IV デバイスを使用しており、バージョン 1.2 のビデオ機能だけでなく、現在は T80(Z80 互換)および ZPU EVO(lution) のソフトプロセッサーも提供します。これは、Sharp MZ シリーズマシンの内部に設置し、そのマシンに異なる CPU と異なるオペレーティングシステムを提供するボードを作成するという当初の設計目標を達成するものです。T80 の提供はパフォーマンス向上や研究/実験のための独自命令の作成/変更以外の多くの利点は提供しませんが、ZPU EVO は Sharp MZ ハードウェアフレームワーク内で動作する全く新しい 32 ビットアーキテクチャを提供します。

ソフト ZPU プロセッサーを使用して、zOS オペレーティングシステムは MZ-700 コンソール上のホストオペレーティングシステムとして機能し、ARM Cortex-M4 K64F I/O プロセッサーの組み込みオペレーティングシステムとしても機能します。

近い将来、Sharp MZ コンソールに座って ZPU または ARM バージョンの zOS を選択できるようになる予定です。追加のプロセッサーとオペレーティングシステムも可能であり、75K/115K LE FPGA にはそれらをホストする容量があるため、M68000 バージョンや Linux を実行するための Amber プロセッサーを移植する可能性があります。

FPGA バージョン 1.2 - Cyclone III

tranZPUter SW-700 ハードウェアのバージョン 1.2 の Cyclone III FPGA は、Sharp MZ-700 向けに強化されたビデオ機能を提供します。Sharp MZ エミュレーターをベースとして、Sharp MZ ビデオハードウェア機能のほぼすべてとカラーピクセルマップグラフィックスを提供できます。また、GPU(グラフィックスプロセッシングユニット)の初期的な基盤も提供します。FPGA が提供する機能:

  • Sharp MZ 機のビデオ機能:MZ-80K、MZ-80C、MZ-1200、MZ-80A、MZ-700、MZ-80B(GRAM I/II 含む)。
  • カラーピクセルグラフィックスモード、8 色 640x200 および 320x200。
  • 複数のビデオ出力モード:オリジナル、VGA 640x480@60Hz、VGA 800x600@60Hz、VGA 1024x768@60Hz。
モジュール 説明
VideoController700_Toplevel.vhd トップレベル設計ファイル。回路のルートスキーマティックに相当します。FPGA に入力されるメインコンポーネント信号とその使用方法をレイアウトします。
VideoController700_pkg.vhd 関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
VideoController700.vhd メイン設計ファイル。FPGA 内のターゲット回路でゲートとワイヤーの相互接続を形成するためのすべてのロジックを含みます。
build/VideoController700.qpf Quartus Prime がプロジェクトとそのすべてのファイルを宣言するために使用するプロジェクトファイル。
build/VideoController700.qsf 定義および割り当てファイル。コンパイル、フィッティング、使用するピンとその名前・パラメーターなどすべてのパラメーターを設定します。このファイルは Quartus Prime によって作成されますが、Quartus Prime GUI を使うよりも手作業で変更する方が早い場合もあります。
build/VideoController700_constraints.sdc Time Quest タイミング解析ツールが作成・使用するタイミング制約ファイル。コンパイラとフィッターが FPGA 内のコンポーネント配置を決定する際にも使用されます。
build/SFL.vhd シリアルフラッシュローダーの宣言。シリアルフラッシュローダーは、専用シリアルブートピンを介して接続されたシリアルフラッシュデバイスをプログラムするために使用される Altera Megacore IP コンポーネントです。シリアルフラッシュデバイスは電源サイクル時に FPGA ビットストリームをロードするために使用されます。
build/SFL_inst.vhd FPGA 経由で EPCS16 デバイスをプログラムするために使用されるシリアルフラッシュローダー IP のインスタンス化宣言。
build/SFL.qip シリアルフラッシュローダーの IP 宣言。Altera Megacore ライブラリパッケージです。
build/Video_Clock.vhd さまざまなビデオベースクロックを作成する FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。
build/Video_Clock_inst.vhd PLL IP のインスタンス化宣言。
build/Video_Clock.qip PLL 要件の IP 宣言。
build/Video_Clock_II.vhd さまざまなビデオベースクロックを作成する 2 番目の FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。ビデオベース周波数には 1 つの PLL では対応できない複数のクロックが必要なため、2 番目の PLL を使用します。
build/Video_Clock_II_inst.vhd 2 番目の PLL IP のインスタンス化宣言。
build/Video_Clock_II.qip 2 番目の PLL 要件の IP 宣言。

FPGA v1.2 ビットストリームのビルド

VHDL コードを FPGA にアップロード可能なビットストリームにビルドまたはコンパイルするには、Altera の Quartus Prime v13.1 を使用する必要があります。これは優れたソフトウェアであり、Web エディションは無料でダウンロードして使用できます。最新の Altera 製品を除くすべての製品、特に Cyclone III EP3C シリーズの開発に適しています。

Quartus Prime を Windows/Linux ワークステーションにインストールするか、以下に説明する Docker イメージを作成することができます。さまざまな Linux ディストリビューションへの複数回のインストール経験から、Docker の使用がこの複雑なパッケージを使用する最も簡単な方法です。

コンパイル:

   1. Quartus Prime v13.1 を起動します(ローカルインストールまたは Docker イメージ)。
   2. 'File->Open Project' に移動し、リポジトリのクローンが保存されているディレクトリを検索して、<Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/VideoController700.qpf のファイルを選択します。これにより FPGA tranZPUter SW-700 プロジェクトが開きます。
   3. 'Processing->Start Compilation' を選択します - 警告メッセージは無視して構いません。
   4. 完了すると、<Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files ディレクトリに VideoController700.sof という名前のビットストリームが作成されます。

FPGA のプログラミング:

   1. FPGA にビットストリームをアップロードするには、tranZPUter SW-700 ボードの 10 ピン JTAG IDC コネクターに USB ポートで接続した Altera USB Blaster が必要です。
   2. Quartus Prime で 'Tools->Programmer' に移動すると、新しいプログラマーウィンドウが起動します。
   3. プログラマーウィンドウで 'Hardware Setup' をクリックして USB アダプターを選択し、'Close' をクリックします。
   4. 'Auto Detect' をクリックすると、EPM7512AET144、EP3C25E144、EPCS16 の 3 つのデバイスが見つかるはずです。
   5. EP3C25E144 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files/VideoController700.sof にある sof ファイルを選択し、Open をクリックします。
   6. EP3C25E144 に対して 'Program/Configure' のチェックボックスを選択します。
   7. 'Start' をクリックすると、FPGA にコンパイル済みビットストリームがプログラムされます。
   8. FPGA のプログラミングは永続的ではなく、電源を切るとビットマップが失われます。プログラミングを永続的にするには、以下の手順に従って EPCS16 をプログラムしてください。

EPCS16 のプログラミング:

   1. EPCS16(FPGA が電源投入時に読み出す不揮発性シリアルフラッシュ RAM)にビットストリームをアップロードするには、tranZPUter SW-700 ボードの 10 ピン JTAG IDC コネクターに USB ポートで接続した Altera USB Blaster が必要です。
   2. Quartus Prime で 'File->Convert Programming Files' に移動すると、新しい 'Convert Programming File' ウィンドウが起動します。
   3. Convert Programming File ウィンドウで:
     3a. 'Programming File Type' をクリックし、JTAG Indirect Configuration File を選択します。
     3b. 'Configuration Device' をクリックし、EPCS16 を選択します。
     3c. 'File Name' をクリックし、<Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files/VideoController700.sof を選択します。
     3d. 'Flash Loader' をクリックし、'Add Device' ボタンをクリックします。Cyclone III -> EP3C25 を選択し、OK をクリックします。
     3e. 'SOF Data' をクリックし、'Add File' ボタンをクリックします。出力ファイル <Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files/VideoController700.jic を選択し、OK をクリックします。
     3f. 'Generate' ボタンをクリックすると、出力 JIC ファイルが <Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files/VideoController700.jic として作成されます。
     3g. 'Close' をクリックして Convert Programming File ウィンドウを閉じます。
   4. Quartus Prime で 'Tools->Programmer' に移動すると、新しいプログラマーウィンドウが起動します。
   5. プログラマーウィンドウで 'Hardware Setup' をクリックして USB アダプターを選択し、'Close' をクリックします。
   6. 'Auto Detect' をクリックすると、EPM7512AET144、EP3C25E144、EPCS16 の 3 つのデバイスが見つかるはずです。
   7. EP3C25E144 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files/VideoController700.sof にある sof ファイルを選択し、Open をクリックします。
   8. EPCS16 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/tranZPUter/FPGA/SW700/v1.2/build/output_files/VideoController700.jic にある jic ファイルを選択し、Open をクリックします。
   9. EP3C25E144 に対して 'Program/Configure' のチェックボックスを選択します。
  10. EPCS16 に対して 'Program/Configure' と 'Verify' のチェックボックスを選択します。
  11. 'Start' をクリックすると、FPGA と EPCS16 不揮発性フラッシュ RAM にコンパイル済みビットストリームがプログラムされます。
  12. FPGA のプログラミングは永続的になり、電源サイクルをまたいで保持されます。

FPGA バージョン 1.3 - Cyclone IV

tranZPUter SW-700 ハードウェアのバージョン 1.3 の Cyclone IV FPGA は、Sharp MZ-700 向けの v1.2 ボードの強化されたビデオ機能だけでなく、ZPU EVO(lution) などのソフト CPU セットも提供します。この FPGA が提供する機能:

  • Sharp MZ 機のビデオ機能:MZ-80K、MZ-80C、MZ-1200、MZ-80A、MZ-700、MZ-800、MZ-80B(GRAM I/II 含む)、MZ-2000(GRAM I/II/III 含む)。
  • カラーピクセルグラフィックスモード、8 色 640x400、640x200 および 320x200。
  • 複数のビデオ出力モード:オリジナル 50Hz、オリジナル 60Hz、VGA 640x480@60Hz、VGA 800x600@60Hz。
  • T80 ソフト CPU(VHDL で記述された Z80 互換プロセッサー)。
  • ZPU EVO(lution) ソフト CPU(zOS オペレーティングシステムを実行する 32 ビットスタックベースプロセッサー)。
  • MZ-80K から MZ-2200 までのすべての Sharp MZ 機のハードウェアエミュレーションを提供する Sharp MZ シリーズ FPGA エミュレーション。
モジュール 説明
coreMZ.vhd 標準 Sharp MZ コアロジックのトップレベル設計ファイル。回路のルートスキーマティックに相当します。FPGA に入力されるメインコンポーネント信号とその使用方法をレイアウトします。
coreMZ_pkg.vhd 関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
coreMZ_constraints.sdc Time Quest タイミング解析ツールが作成・使用するタイミング制約ファイル。コンパイラとフィッターが FPGA 内のコンポーネント配置を決定する際にも使用されます。
coreMZ.qip 標準 Sharp MZ コアロジック(ビデオコントローラーとインターフェース)を記述する Quartus IP ファイル。
coreMZ_emuMZ_constraints.sdc Time Quest タイミング解析ツールが作成・使用するタイミング制約ファイル。コンパイラとフィッターが FPGA 内のコンポーネント配置を決定する際にも使用されます。
coreMZ_emuMZ.qip Sharp MZ シリーズ FPGA エミュレーションロジックとインターフェースを含む Sharp MZ コアを記述する Quartus IP ファイル。
coreMZ_emuMZ.vhd Sharp MZ コアロジックと Sharp MZ シリーズ FPGA エミュレーションロジックのトップレベル設計ファイル。回路のルートスキーマティックに相当します。FPGA に入力されるメインコンポーネント信号とその使用方法をレイアウトします。
coreMZ_SoftCPU_constraints.sdc Time Quest タイミング解析ツールが作成・使用するタイミング制約ファイル。コンパイラとフィッターが FPGA 内のコンポーネント配置を決定する際にも使用されます。
coreMZ_SoftCPU.qip ホスト上でプライマリプロセッサーとして動作する ZPU Evo/T80 プロセッサーを含む Sharp MZ コアロジックを記述する Quartus IP ファイル。
coreMZ_SoftCPU.vhd Sharp MZ コアと ZPU Evo/T80 プロセッサーロジックのトップレベル設計ファイル。回路のルートスキーマティックに相当します。FPGA に入力されるメインコンポーネント信号とその使用方法をレイアウトします。
  ビデオコントローラーモジュール。
VideoController/VideoController.vhd ビデオコントローラー設計ファイル。Sharp MZ 互換ビデオコントローラーをインスタンス化するためのすべてのロジックを含みます。
VideoController/VideoController_pkg.vhd ビデオコントローラーパッケージ設定ファイル。関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
VideoController/VideoController_constraints.sdc ビデオコントローラー用タイミング制約ファイル。
soft68K Motorola M68000 ソフトプロセッサー用のプレースホルダーディレクトリ。
  T80/AZ80/NextZ80 モジュール。
softT80.qip ソフト T80 プロセッサーコンポーネントを記述する Quartus IP ファイル。
softT80/softT80.vhd T80 ソフト CPU 設計ファイル。T80 をこの設計にバインドするための宣言とグルーロジックを含みます。
softT80/softT80_pkg.vhd T80 パッケージ設定ファイル。関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
softT80/softT80_constraints.sdc タイミング制約ファイル。
softT80/T80/T80a.vhd Z80 と同じ信号を持つ標準 Z80 プロセッサーを記述する T80 設計ファイル。
softT80/T80/T80.vhd Z80 プロセッサーを記述する T80 設計ファイル。
softT80/T80/T80_Pack.vhd  
softT80/T80/T80_MCode.vhd  
softT80/T80/T80_ALU.vhd  
softT80/T80/T80_Reg.vhd  
softT80/T80/T80_RegX.vhd  
softT80/AZ80/* Z80 プロセッサーを記述する AZ80 設計ファイル。
softT80/NextZ80/* Z80 プロセッサーを記述する NextZ80 設計ファイル。
  ZPU Evolution モジュール。
softZPU.qip ソフト ZPU Evolution プロセッサーコンポーネントを記述する Quartus IP ファイル。
softZPU/softZPU.vhd ZPU ソフト CPU 設計ファイル。ZPU Evolution プロセッサーをこの設計にバインドするための宣言とグルーロジックを含みます。
softZPU/softZPU_pkg.vhd ZPU パッケージ設定ファイル。関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
softZPU/softZPU_constraints.sdc タイミング制約ファイル。
softZPU/ZPU/zpu_core_evo.vhd ZPU Evolution 設計ファイル。ZPU Evolution プロセッサーを記述します。
softZPU/ZPU/zpu_core_evo_L2.vhd ZPU Evolution レベル 2 キャッシュ設計ファイル。レベル 2 キャッシュメカニズムを記述します。
softZPU/ZPU/zpu_uard_debug.vhd ZPU Evolution デバッグハードウェア。この設計では使用されませんが、通常は接続されたシリアルポートにリアルタイムのデバッグ情報を送信します。
softZPU/ZPU/zpu_pkg.vhd ZPU Evolution プロセッサーのセットアップ用の関数、定数宣言、パラメーターを含むファイル。
  オンボード EPCS64 フラッシュ ROM のプログラミング用 Quartus シリアルフラッシュロジックモジュール。
SFL/SFL_IV.vhd シリアルフラッシュローダーの宣言。シリアルフラッシュローダーは、専用シリアルブートピンを介して接続されたシリアルフラッシュデバイスをプログラムするために使用される Altera Megacore IP コンポーネントです。シリアルフラッシュデバイスは電源サイクル時に FPGA ビットストリームをロードするために使用されます。
SFL/SFL_IV_inst.vhd FPGA 経由で EPCS64 デバイスをプログラムするために使用されるシリアルフラッシュローダー IP のインスタンス化宣言。
SFL/SFL_IV.qip シリアルフラッシュローダーの IP 宣言。Altera Megacore ライブラリパッケージです。
  フェーズロックドループモジュール。
PLL/Video_Clock.vhd さまざまなビデオベースクロックを作成する FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。
PLL/Video_Clock_inst.vhd PLL IP のインスタンス化宣言。
PLL/Video_Clock.qip PLL 要件の IP 宣言。
PLL/Video_Clock_II.vhd さまざまなビデオベースクロックを作成する 2 番目の FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。ビデオベース周波数には 1 つの PLL では対応できない複数のクロックが必要なため、追加の PLL を使用します。
PLL/Video_Clock_II_inst.vhd 2 番目の PLL IP のインスタンス化宣言。
PLL/Video_Clock_II.qip 2 番目の PLL 要件の IP 宣言。
PLL/Video_Clock_III.vhd さまざまなビデオベースクロックを作成する 3 番目の FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。ビデオベース周波数には 1 つの PLL では対応できない複数のクロックが必要なため、追加の PLL を使用します。
PLL/Video_Clock_III_inst.vhd 3 番目の PLL IP のインスタンス化宣言。
PLL/Video_Clock_III.qip 3 番目の PLL 要件の IP 宣言。
PLL/Video_Clock_IV.vhd ソフト CPU ベースクロックを作成する 4 番目の FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。ビデオベース周波数には 1 つの PLL では対応できない複数のクロックが必要なため、追加の PLL を使用します。
PLL/Video_Clock_IV_inst.vhd 4 番目の PLL IP のインスタンス化宣言。
PLL/Video_Clock_IV.qip 4 番目の PLL 要件の IP 宣言。
build/coreMZ.qpf Quartus Prime がプロジェクトとそのすべてのファイルを宣言するために使用するプロジェクトファイル。
build/coreMZ.qsf 定義および割り当てファイル。コンパイル、フィッティング、使用するピンとその名前・パラメーターなどすべてのパラメーターを設定します。このファイルは Quartus Prime によって作成されますが、Quartus Prime GUI を使うよりも手作業で変更する方が早い場合もあります。
devices/sysbus/BRAM/TZSW_SinglePortBootBRAM.vhd ZPU プロセッサー用の 32 ビット幅 RAM 定義。
  Sharp MZ シリーズ FPGA エミュレーションモジュール
emuMZ/emuMZ_pkg.vhd 関数、定数宣言、パラメーターを含み、コンパイルされたすべての VHDL ファイル/モジュールで使用されます。
emuMZ/emuMZ.vhd エミュレーションのコアロジック。
emuMZ/emuMZ.qip エミュレーション機能に必要なモジュールを記述する Quartus IP ファイル。
emuMZ/arbiter.vhd ホストバスへのアクセスのための単純な調停サービス用 VHDL。
emuMZ/clkgen.vhd 分周を使用したプログラマブルクロック生成モジュール用 VHDL。
emuMZ/cmt_hw.vhd 実際の CMT ドライブをエミュレーションとエミュレートされた CMT ドライブの間でインターフェースする VHDL。
emuMZ/cmt.vhd Sharp PWM テープインターフェースを完全にエミュレートする VHDL。
emuMZ/i8254/i8254_counter.vhd i8254 タイマーモジュール用 VHDL。
emuMZ/i8254/i8254.vhd i8254 プログラマブルインターバルタイマー IC を記述する VHDL。
emuMZ/i8255/i8255.vhd i8255 プログラマブルペリフェラルインターフェース IC を記述する VHDL。
emuMZ/iointr.vhd エミュレーションサポート回路が I/O プロセッサー上で割り込みを生成できるようにするための単純な割り込みサービス用 VHDL。
emuMZ/keymatrix_mz700.vhd MZ-700 ハードウェアスキャン結果を有効なエミュレーションが期待するスキャン値に変換する VHDL キーボードモジュール。
emuMZ/keymatrix_mz2000.vhd MZ-2000 ハードウェアスキャン結果を有効なエミュレーションが期待するスキャン値に変換する VHDL キーボードモジュール。
emuMZ/keymatrix_ps2.vhd PS2 キーコードを Sharp スキャンマトリックスキー接続に変換する VHDL キーボードモジュール。
emuMZ/mctrl.vhd 同期リセット管理とともにエミュレーションのプログラマブル制御用 VHDL。
emuMZ/mz80b.vhd MZ-80B ビジネスコンピューターシリーズロジック用 VHDL。
emuMZ/mz80c.vhd MZ-80A パーソナルコンピューターシリーズロジック用 VHDL。
emuMZ/z8420/Interrupt.vhd Z80 PIO デイジーチェーン割り込みロジック用 VHDL
emuMZ/z8420/z8420.vhd Z80 PIO IC 用 VHDL。

FPGA v1.3 ビットストリームのビルド

VHDL コードを FPGA にアップロード可能なビットストリームにビルドまたはコンパイルするには、Altera の Quartus Prime v17.1 を使用する必要があります。これは優れたソフトウェアであり、Web エディションは無料でダウンロードして使用できます。最新の Altera 製品を除くすべての製品、特に Cyclone IV EP4CE シリーズの開発に適しています。

Quartus Prime を Windows/Linux ワークステーションにインストールするか、以下に説明する Docker イメージを作成することができます。さまざまな Linux ディストリビューションへの複数回のインストール経験から、Docker の使用がこの複雑なパッケージを使用する最も簡単な方法です。

コンパイル:

   1. Quartus Prime v17.1 を起動します(ローカルインストールまたは Docker イメージ)。
   2. 'File->Open Project' に移動し、リポジトリのクローンが保存されているディレクトリを検索して、<Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/coreMZ.qpf のファイルを選択します。これにより FPGA tranZPUter SW-700 プロジェクトが開きます。
   3. 'Processing->Start Compilation' を選択します - 警告メッセージは無視して構いません。
   4. 完了すると、<Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files ディレクトリに VideoController700.sof という名前のビットストリームが作成されます。

FPGA のプログラミング:

   1. FPGA にビットストリームをアップロードするには、tranZPUter SW-700 ボードの 10 ピン JTAG IDC コネクターに USB ポートで接続した Altera USB Blaster が必要です。
   2. Quartus Prime で 'Tools->Programmer' に移動すると、新しいプログラマーウィンドウが起動します。
   3. プログラマーウィンドウで 'Hardware Setup' をクリックして USB アダプターを選択し、'Close' をクリックします。
   4. 'Auto Detect' をクリックすると、EPM7512AET144、EP4CE75F23、EPCS64 の 3 つのデバイスが見つかるはずです。
   5. EP3C25E144 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files/coreMZ.sof にある sof ファイルを選択し、Open をクリックします。
   6. EP4CE75F23 に対して 'Program/Configure' のチェックボックスを選択します。
   7. 'Start' をクリックすると、FPGA にコンパイル済みビットストリームがプログラムされます。
   8. FPGA のプログラミングは永続的ではなく、電源を切るとビットマップが失われます。プログラミングを永続的にするには、以下の手順に従って EPCS54 をプログラムしてください。

EPCS16 のプログラミング:

   1. EPCS16(FPGA が電源投入時に読み出す不揮発性シリアルフラッシュ RAM)にビットストリームをアップロードするには、tranZPUter SW-700 ボードの 10 ピン JTAG IDC コネクターに USB ポートで接続した Altera USB Blaster が必要です。
   2. Quartus Prime で 'File->Convert Programming Files' に移動すると、新しい 'Convert Programming File' ウィンドウが起動します。
   3. Convert Programming File ウィンドウで:
     3a. 'Programming File Type' をクリックし、JTAG Indirect Configuration File を選択します。
     3b. 'Configuration Device' をクリックし、EPCS64 を選択します。
     3c. 'File Name' をクリックし、<Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files/coreMZ.sof を選択します。
     3d. 'Flash Loader' をクリックし、'Add Device' ボタンをクリックします。Cyclone IV -> EP4CE75 を選択し、OK をクリックします。
     3e. 'SOF Data' をクリックし、'Add File' ボタンをクリックします。出力ファイル <Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files/coreMZ.jic を選択し、OK をクリックします。
     3f. 'Generate' ボタンをクリックすると、出力 JIC ファイルが <Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files/coreMZ.jic として作成されます。
     3g. 'Close' をクリックして Convert Programming File ウィンドウを閉じます。
   4. Quartus Prime で 'Tools->Programmer' に移動すると、新しいプログラマーウィンドウが起動します。
   5. プログラマーウィンドウで 'Hardware Setup' をクリックして USB アダプターを選択し、'Close' をクリックします。
   6. 'Auto Detect' をクリックすると、EPM7512AET144、EP4CE75F23、EPCS64 の 3 つのデバイスが見つかるはずです。
   7. EP3C25E144 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files/coreMZ.sof にある sof ファイルを選択し、Open をクリックします。
   8. EPCS16 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/tranZPUter/FPGA/SW700/v1.3/build/output_files/coreMZ.jic にある jic ファイルを選択し、Open をクリックします。
   9. EP4CE75F23 に対して 'Program/Configure' のチェックボックスを選択します。
  10. EPCS64 に対して 'Program/Configure' と 'Verify' のチェックボックスを選択します。
  11. 'Start' をクリックすると、FPGA と EPCS64 不揮発性フラッシュ RAM にコンパイル済みビットストリームがプログラムされます。
  12. FPGA のプログラミングは永続的になり、電源サイクルをまたいで保持されます。

Docker 上の Quartus Prime

Quartus Prime のインストールは、ドキュメントが不十分な Linux インストールが誤ったパッケージの組み合わせや不足したパッケージにつながり、機能しないインストールになる可能性があるため、面倒で時間がかかることがあります。この負担を軽減するため、Ubuntu、必要なパッケージ、および Quartus Prime 13.0sp1、13.1、17.1.1 を含む Docker イメージをまとめました。Quartus Prime 13.0sp1 は CPLD コンパイルに、Quartus Prime 13.1 は Cyclone III FPGA に、Quartus Prime 17.1.1 は Cyclone IV FPGA に必要です。
  1. リポジトリをクローン:

     cd ~
     git clone https://git.eaw.app/eaw/zpu.git
     cd zpu/docker/QuartusPrime
    

    現在の設定では Quartus Prime の Lite バージョンをビルドします。Standard バージョンをインストールする場合は、Docker イメージをビルドする前に:
     編集:        zpu/docker/QuartusPrime/Dockerfile.13.0.1
     コメント解除:   '#ARG QUARTUS=QuartusSetup-13.0.1.232.run'
     コメントアウト: 'ARG QUARTUS=QuartusSetupWeb-13.0.1.232.run'
    

    ライセンスファイルがある場合:

     コピー: <your license file> を zpu/docker/QuartusPrime/files/license.dat へ
     編集:  zpu/docker/QuartusPrime/run.sh
     変更: MAC_ADDR="02:50:dd:72:03:01" をライセンスファイルの MAC アドレスに変更。
    

    Docker イメージをビルド:

     docker build -f Dockerfile.13.0.1 -t quartus-ii-13.0.1 --build-arg user_uid=`id -u`  --build-arg user_gid=`id -g` --build-arg user_name=`whoami` .
    

    Quartus Prime 13.1 または 17.1.1 の場合は 13.0.1 を必要なバージョンに置き換えてください。Quartus Prime 13.0.1 は古い MAX CPLD デバイスをサポートします。Quartus Prime 13.1 は古い Cyclone III デバイスをサポートし、17.1.1 は Cyclone IV デバイスをサポートします。
  2. X DISPLAY 変数を X サーバーを指すように設定:

     export DISPLAY=<x server ip or hostname>:<screen number or :<screen number>>
     # 例: export DISPLAY=192.168.1.1:0
    

    X サーバーマシン上で以下のコマンドを実行:

     xhost +
     # またはプライベートでないネットワークでセキュリティを維持するには xhost <ip of docker host>
    
  3. Quartus からアクセス可能なプロジェクトディレクトリを設定。

     編集:        zpu/docker/QuartusPrime/run.sh
     変更:      PROJECT_DIR_HOST=<Quartus Prime からアクセスしたいホスト上の場所>
     変更:      PROJECT_DIR_IMAGE=<上記ホストディレクトリがマップされる Quartus Prime 実行コンテナ内の場所>
     # 例: PROJECT_DIR_HOST=/srv/quartus
               PROJECT_DIR_IMAGE=/srv/quartus
    
  4. 提供された bash スクリプト ‘run_quartus.sh’ を使用してイメージを実行します。このスクリプトは

     ./run_quartus.sh
    

    これにより Quartus Prime と対話型 bash シェルが起動します。
    初回起動時は現在ライセンスファイルの確認を求めます。'Run the Quartus Prime software' をクリックし、OK をクリックしてください。

    ホストデバイスは実行中の Docker コンテナにマップされているため、USB Blaster を接続するとプログラマーツール内で認識されます。インストールの一部として、USB-Blaster と USB-Blaster II の udev ルール、および CYC1000 開発ボード用の Arrow USB-Blaster ドライバーもインストールします。
  5. Quartus Prime を停止するには:

     # メインの Quartus Prime GUI ウィンドウで File->Exit から終了するか
     # または
     docker stop quartus
    



ソフトウェア

既存の ZPU ソフトウェアである ZPUTA と zOS は、このデザインで使用するために K64F プラットフォームに移植されています。zOS は K64F プロセッサーの中核 OS プラットフォームとなり、I/O プロセッサー固有の操作は OS のスレッドと外部アプリケーション内で処理されます。

バージョン v1.3 以降では ZPU がホストプロセッサーとして組み込まれ、それに応じて zOS が更新されました。必要なハードウェアドライバー機能を含む 'SharpMZ' モジュールが追加されています。ビルド時のフラグがビルドスクリプトをガイドし、ホストプロセッサー用途に特化した zOS バージョンを作成します。

zOS

オペレーティングシステムの詳細については zOS のセクションを参照してください。標準機能とツールに加えて、以下のアプリケーションが追加されています:

コマンド 説明
tzload tranZPUter メモリへのファイルのアップロードとダウンロード、ビデオフレームの取得、新しいフレームの設定。
tzdump tranZPUter メモリの内容を画面にダンプ表示
TZDUMP v1.1

コマンド:-
  -h | --help              このヘルプテキスト。
  -a | --start             開始アドレス。

オプション:-
  -e | --end               終了アドレス(--size の代替として使用可能)。
  -s | --size              ダンプするメモリブロックのサイズ(--end の代替として使用可能)。
  -f | --fpga              操作は FPGA メモリに対して行われます。このフラグなしのデフォルトは tranZPUter メモリを対象とします。
  -m | --mainboard         操作は MZ80A マザーボード上で行われます。このフラグなしのデフォルトは tranZPUter メモリを対象とします。
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzdump -a 0x000000 -s 0x200   # 0x000000 から 0x000200 まで tranZPUter メモリをダンプ。
tzclear tranZPUter メモリのクリア。
TZCLEAR v1.1

コマンド:-
  -h | --help              このヘルプテキスト。
  -a | --start             開始アドレス。

オプション:-
  -e | --end               終了アドレス(--size の代替として使用可能)。
  -s | --size              クリアするメモリブロックのサイズ(--end の代替として使用可能)。
  -b | --byte              クリアした各メモリ位置に書き込むバイト値。デフォルトは 0x00。
  -f | --fpga              操作は FPGA メモリに対して行われます。このフラグなしのデフォルトは tranZPUter メモリを対象とします。
  -m | --mainboard         操作は MZ80A マザーボード上で行われます。このフラグなしのデフォルトは tranZPUter メモリを対象とします。
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzclear -a 0x000000 -s 0x200 -b 0xAA  # tranZPUter メモリの 0x000000 から 0x000200 までを値 0xAA でクリア。
tzclk 代替 Z80 CPU クロック周波数の設定。
TZCLK v1.0

コマンド:-
  -h | --help              このヘルプテキスト。
  -f | --freq              希望する CPU クロック周波数。

オプション:-
  -e | --enable            セカンダリ CPU クロックを有効化。
  -d | --disable           セカンダリ CPU クロックを無効化。
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzclk --freq 4000000 --enable  # セカンダリ CPU クロック周波数を 4MHz に設定し、tranZPUter ボード上での使用を有効化。
tzreset tranZPUter のリセット。
TZRESET v1.0

コマンド:-
  -h | --help              このヘルプテキスト。
  -r | --reset             ハードウェアリセットを実行。
  -l | --load              デフォルト ROM を再ロード。
  -m | --memorymode <val>  メモリモードの設定。

オプション:-
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzreset -r        # Z80 および関連する tranZPUter ロジックをリセット。
tzio Z80 I/O ポート読み書きツール。
TZIO v1.1

コマンド:-
  -h | --help              このヘルプテキスト。
  -o | --out <port>        I/O アドレスへ出力。
  -i | --in <port>         I/O アドレスから入力。

オプション:-
  -b | --byte              --out コマンドで I/O ポートに送るバイト値。デフォルトは 0x00。
  -m | --mainboard         操作は MZ80A マザーボード上で行われます。このフラグなしのデフォルトは tranZPUter I/O ドメインを対象とします。
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzio --out 0xf8 --byte 0x10    # アドレス 0xf8 で FPGA ビデオモードを設定。
tzflupd K64F FlashRAM 更新ツール。実行中の zOS/ZPUTA カーネルを新しいバージョンに更新します。
TZFLUPD v1.1

コマンド:-
  -h | --help              このヘルプテキスト。
  -f | --file              K64F にアップロードしてフラッシュするバイナリファイル。

オプション:-
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzflupd -f zOS_22012021_001.bin --verbose   # zOS_22012021_001.bin ファイルを K64F フラッシュメモリにアップロードして書き込み。
tzmtest TranZPUter メモリテストプログラム。K64F が複数の方式でループし、tranZPUter スタティック RAM と FPGA BRAM をテストします。
TZMTEST v1.0

コマンド:-
  -h | --help              このヘルプテキスト。
  -a | --start             開始アドレス。

オプション:-
  -e | --end               終了アドレス(--size の代替として使用可能)。
  -s | --size              テストするメモリブロックのサイズ(--end の代替として使用可能)。
  -f | --fpga              操作は FPGA メモリに対して行われます。このフラグなしのデフォルトは tranZPUter メモリを対象とします。
  -i | --iter              テストの繰り返し回数、デフォルト = 1。
  -t | --test              ビット値でテストを指定。ビット 0 = R/W インクリメント昇順テスト、1 = R/W インクリメントウォーキングテスト、2 = W 昇順後 R、
                           ビット 3 = W ウォーキング後 R、ビット 4 = エコーおよびスティックビットテスト。
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  tzmtest -a 0x000000 -s 0x20000   # 0x000000 から 0x020000 まで 128K の tranZPUter メモリをテスト。

*T*ran*Z*puter *F*iling *S*ystem

TranZputer ファイリングシステム(TZFS)は、MZ-80A Rom Disk アップグレードボードで使用される Rom Filing System を移植したものです。多くの同一ソフトウェア機能を再利用しているため同等のサービスを提供しますが、異なるメモリモデルを使用している点が違いです。その目的は、SD カードに保存されたファイルを操作するための方法と、拡張コマンドラインインターフェース(TZFS モニター)を提供することです。コマンドセットには SD ファイルの操作・バックアップのほか、MZ700/800 コンピューターに見られる多数のコマンドが含まれています。

SD カードと ROM は K64F I/O プロセッサーによって管理されます。サービスリクエスト API が記述されており、共通共有メモリブロック(640バイト)を物理的な I/O リクエストと連携させることで、Z80 と K64F 間でコマンドとデータをやり取りします。つまり、Z80 が SD ファイルを読み取りたい場合、メモリブロックにファイルオープンのリクエストを作成し、K64F が割り込みで検知する物理 I/O 操作を実行すると、K64F がファイルを開き、共有メモリを通じて 1 セクターずつデータを Z80 に返します。

RFS ではソフトウェアを多くの ROM ページに分割してページングでアクセスする必要がありましたが、TZFS も同様です。ただしページサイズが大きいため、必要なページ数は少なくなっています。TranZputer ファイリングシステムを構成する Z80 ソフトウェアは、リポジトリの <software> ディレクトリ内にあります。

TranZputer ファイリングシステムを構成するファイルは以下のとおりです:

モジュール ターゲット位置 サイズ バンク 説明
tzfs.asm 0xE800:0xFFFF 6K 0 TranZputer ファイリングシステムの主要部と MZ700/MZ800 モニターツール。
tzfs_bank2.asm 0xF000:0xFFFF 4K 1 メッセージ出力ルーチン、静的メッセージ、ASCII 変換、ヘルプ画面。
tzfs_bank3.asm 0xF000:0xFFFF 4K 2 未使用。
tzfs_bank4.asm 0xF000:0xFFFF 4K 3 未使用。
monitor_SA1510.asm 0x00000:0x01000 4K 0 40 文字表示用のオリジナル SA1510 モニター。tranZPUter メモリの 64K バンク 0 にロード。
monitor_80c_SA1510.asm 0x00000:0x01000 4K 0 80 文字表示向けにパッチされたオリジナル SA1510 モニター。必要に応じて tranZPUter メモリの 64K バンク 0 にロード。
monitor_1Z-013A.asm 0x00000:0x01000 4K 0 Sharp MZ-700 用オリジナル 1Z-013A モニター。MZ-80A キーボードおよびアトリビュート RAM カラーを使用するようにパッチ済み。
monitor_80c_1Z-013A.asm 0x00000:0x01000 4K 0 Sharp MZ-700 用オリジナル 1Z-013A モニター。MZ-80A キーボード、アトリビュート RAM カラー、80 カラムモードを使用するようにパッチ済み。
MZ80B_IPL.asm 0x00000:0x01000 4K 0 MZ-80B プログラムをブートストラップするためのオリジナル Sharp MZ-80B IPL ファームウェア。

TZFS ソフトウェアのビルドを補助するいくつかのシェルスクリプトも含まれています:

スクリプト 説明
assemble_tzfs.sh TranZputer ファイリングシステムのバイナリイメージをビルドする bash スクリプト。
assemble_roms.sh TZFS が必要とする SA-1510 モニター ROM など、標準 MZ80A ROM をすべてビルドする bash スクリプト。
flashmmcfg tranZPUter SW FlashRAM デコーダー用デコードマップファイルを生成するバイナリプログラム。
glass-0.5.1.jar Glass リリース 0.5 のバグ修正版。0.5 は 0xFFFF に 1 バイト書き込めなかったため修正済み。

CP/M

CPM v2.23 が RFS プロジェクトから tranZPUter に移植され、RFS での 48K に対して利用可能な 64K メモリをフルに活用できるよう拡張されました。カスタム BIOS は tranZPUter メモリを活用し、ロジックを別のメモリバンクに再配置することで貴重な CP/M TPA スペースを節約しています。

CBIOS および CP/M オペレーティングシステムを構成するファイルは以下のとおりです:

モジュール ターゲット位置 サイズ バンク 説明
cbios.asm 0xF000:0xFFFF 4K 0 CPM CBIOS スタブ、割り込みサービスルーチン(RTC、キーボード等)、CP/M ディスク記述テーブル、バッファー等。
cbiosII.asm 0x0000:0xCFFF 48K 1 CPM CBIOS、I/O プロセッサーサービス API、SD カードコントローラー機能、フロッピーディスクコントローラー機能、スクリーンおよび ANSI ターミナル機能、ユーティリティ、オーディオ機能。
  0xE800:0xEFFF 2K 1 CBIOSII の追加スペース、現在は未使用。
cpm22.asm 0xDA00:0xEFFF 5K 0 CCP(コンソールコマンドプロセッサー)と BDOS(基本ディスクオペレーティングシステム)で構成される CP/M オペレーティングシステム。これらはサービスを必要としないアプリケーションによって上書きされる場合があり、アプリケーション終了時に再ロードされます。
cpm22-bios.asm     0 カスタム BIOS は自己完結型であり、このスタブにはコードが含まれなくなりました。

CP/M ソフトウェアのビルドを補助するシェルスクリプトも含まれています:

スクリプト 説明
assemble_cpm.sh TZFS 経由でロードする MZF フォーマットアプリケーションとして CPM バイナリをビルドするシェルスクリプト。
make_cpmdisks.sh FAT32 フォーマットの SD カードで使用するバイナリファイルとして CPM ディスクセットをビルドする bash スクリプト。フロッピーディスクエミュレーターまたは物理メディアへのコピー用に CPC 拡張ディスクフォーマットも作成されます。
glass-0.5.1.jar Glass リリース 0.5 のバグ修正版。0.5 は 0xFFFF に 1 バイト書き込めなかったため修正済み。

詳細は CP/M セクションを参照してください。


TZFS モニター

Sharp MZ-700 の電源投入時、ユーザーにはモニターと呼ばれるコマンドラインインターフェースが表示され、テープのブートストラップや事前ロード済みソフトウェアの手動実行といった基本操作が可能です。TZFS モニターはこの基本モニターの拡張版です。tranZPUter SW カードをマザーボードの Z80 ソケットに挿入した後、モニタープロンプト「*」で次のコマンドを入力すると TZFS が起動します:

JE800<cr>

コンピューターを直接 TZFS で自動起動させることも可能です。そのためには SD カードのルートディレクトリに以下の名前の空ファイルを作成してください:

'TZFSBOOT.FLG'

K64F プロセッサーの起動時に zOS が起動し、zOS がこのファイルを検出すると、Sharp MZ-700 上で TZFS が自動起動するために必要な処理を実行します。

TZFS が起動すると、通常の 1Z-013A モニターサインオンバナーが表示され、正常に動作していれば「+ TZFS」というサフィックスが追加されます。通常の「*」プロンプトが表示され、オリジナルの 1Z-013A コマンドに加え、MZ80A/MZ700/MZ800 シリーズに見られるものやカスタムコマンドを含む拡張コマンドセットを使用できます。コマンドの全一覧を以下の表に示します:

コマンド パラメーター 説明
4 なし 40 文字モードへ切り替え。
8 なし 80 文字モードへ切り替え。
40A なし Sharp MZ-80A 40 カラム BIOS およびモードへ切り替え。
80A なし Sharp MZ-80A 80 カラム BIOS およびモードへ切り替え。
80B なし Sharp MZ-80B 互換モードへ切り替え。
700 なし Sharp MZ-700 40 カラム BIOS およびモードへ切り替え。
7008 なし Sharp MZ-700 80 カラム BIOS およびモードへ切り替え。
B なし キー入力ビープ音の有効/無効切り替え。
BASIC なし SD カード上の最初の BASIC インタープリターを検索し、ロードして実行。
C [<8 ビット値>] 0x1200 から RAM の先頭まで 0x00 または指定値でメモリを初期化。
CD [<ディレクトリ>] 指定した SD カードディレクトリ <directory> へ移動。ディレクトリ未指定の場合はデフォルトの \MZF にリセット。ディレクトリ変更後、DIR コマンドは I/O プロセッサーがディレクトリ内容をキャッシュするため数秒かかる場合があります。
CPM なし SD カード上の CP/M 2.23 を検索し、ロードして実行。
D <アドレス>[<アドレス2>] <アドレス> から <アドレス2>(または 20 行分)まで 16 進数と ASCII でメモリダンプ。画面が一杯になるとキー入力待ちで一時停止。

アドレスなしで連続して「D」コマンドを実行すると、前回表示した続きから表示。

ページング中に認識されるキー:
「D」 - 次ページ、「U」 - 前ページ、「X」 - 終了、その他のキーでデータを 1 画面表示。
DIR <ワイルドカード> SD カードに保存されたファイルの一覧表示。各ファイルタイトルの前に識別用の 16 進数が付きます。
ワイルドカードパターンを指定して結果を絞り込めます(例:「*BASIC*」で BASIC を含む全ファイルを一覧表示)。
出力形式は HH<区切り文字>ファイル名。<区切り文字> はファイルの種別を示します:
「.」= マシン語、「-」= BASIC MZ80K/C/A、「<-」= BASIC MZ-700/800、「+」= その他。
EC <名前> または
<ファイル番号>
SD カードからファイルを消去。<名前> または <ファイル番号> に一致するファイルを SD カード上で検索し、見つかれば消去。
EX なし TZFS を終了してマシンを元の状態に戻し、I/O プロセッサーを無効化。
F [<ドライブ番号>] 指定したフロッピーディスクからブート。ディスク番号が指定されない場合は入力を促します。
FREQ <周波数(KHz)> CPU 周波数を指定値に変更。0 でデフォルト周波数に戻す。あらゆる周波数が可能で、CPU が制限要因となります。搭載の 20MHz Z80 CPU では最大 24MHz が検証済み。
H なし これらのコマンドのヘルプ画面を表示。
J <アドレス> <アドレス> の位置にジャンプ(実行開始)。
L | LT [,<ハードウェアモード>] テープからファイルをメモリにロードして実行。

<ハードウェアモード> はコマンドで使用するマシンのカセットシステムを指定します。例:MZ-80B は 1800 ボードのデータレートを使用するため、このマシンを選択すると MZ-80B/MZ-2000 カセットを読み取れます。

ハードウェアオプションフラグ:
K - MZ-80K、C - MZ-80C、1 = MZ-1200、A - MZ-80A、
7 - MZ-700、8 - MZ-800、B - MZ-80B、2 - MZ-2000
LTNX [,<ハードウェアモード>] テープからファイルをメモリにロード、実行しない。
<ハードウェアモード> は LT と同様。
LC <名前> または
<ファイル番号>[,<ターゲットモデル>]
SD カードからファイルをメモリにロード。<名前> または <ファイル番号> に一致するファイルを SD カード上で検索し、見つかればロードして実行。
オプション引数 <ターゲットモデル> により、ロードしたソフトウェアを実行すべきターゲットを設定できます。この引数は、デフォルトで MZ-800 として実行するが MZ-700 互換モードを強制したい MZ-800 のようなマシン向けです。ホストマシンのオリジナルメモリにソフトウェアをロードして実行するためにも使用されます。現在のフラグ:
8 - MZ-800 ホストで MZ-800 モードを強制。
7 - MZ-800 ホストで MZ-700 モードを強制。
O - ホストメモリにロードしてオリジナルとして実行。
LCNX <名前> または
<ファイル番号>[,<ターゲットモデル>]
SD カードからファイルをメモリにロード。<名前> または <ファイル番号> に一致するファイルを SD カード上で検索し、見つかればロードするが実行しない。
<ターゲットモデル> は LC と同様。
M <アドレス> <アドレス> から始まるメモリ位置を編集・変更。
MZ [<マシン>] Sharp MZ シリーズハードウェアエミュレーターを起動。ホストの MZ-700 を他の MZ シリーズマシン(例:MZ-80B)をエミュレートするよう再設定します。

<マシン> はオプションパラメーターで、初期起動マシンを指定します。このオプションなしの初期マシンは MZ-80K で、OSD メニューで変更できます。OSD メニューは SHIFT+BLANK を押すと起動し、同じキーを押すと閉じます。

マシン選択:
MZ80K、MZ80C、MZ1200、MZ80A、MZ700、MZ800、MZ80B、MZ2000。
P なし 接続されたプリンターのテスト実行。
R なし メインメモリのメモリテスト実行。
S <開始アドレス> <終了アドレス> <実行アドレス>[,<ハードウェアモード>] メモリのブロックをテープに保存。ファイル名の入力を促されます。

例:S120020001203 - 0x1200 から 0x2000 まで保存し、実行アドレスを 0x1203 に設定。

<ハードウェアモード> は LT と同様。
SC <開始アドレス> <終了アドレス> <実行アドレス>[,<ハードウェアモード>] メモリのブロックを MZF ファイルとして SD カードに保存。SD カード上で作成するファイル名の入力を促されます。

<ハードウェアモード> は LT と同様。
SD2T <名前> または
<ファイル番号>[,<ハードウェアモード>]
SD カードからテープへファイルをコピー。<名前> または <ファイル番号> に一致するファイルを SD カード上で検索し、見つかれば CMT のテープにコピー。

<ハードウェアモード> は LT と同様。
T なし 8253 タイマーのテスト。
T2SD[B] [,<ハードウェアモード>] テープから SD カードへファイルをコピー。テープからプログラムをロードし、SD カードの空き位置に書き込みます。コマンド末尾に B を追加するとバッチモードが有効になり、1 本以上のカセットのすべてのプログラムを変換するループに入ります。BREAK キーを押すかエラーが発生すると停止。

<ハードウェアモード> は LT と同様。
T80 なし ソフト T80 CPU に切り替え、ハード Z80 を無効化。
V なし テープに書き込んだばかりのファイルをメモリ内のオリジナルデータと照合
VBORDER <カラー> VGA ボーダーカラーを設定。
0 = 黒
1 = 緑
2 = 青
3 = シアン
4 = 赤
5 = 黄
6 = マゼンタ
7 = 白。
VMODE <ビデオモード> 拡張 FPGA ビデオモジュールを使用してビデオモードを選択。FPGA は選択したマシンのビデオハードウェアをエミュレートするよう自身を再設定します。
0 = MZ-80K
1 = MZ-80C
2 = MZ-1200
3 = MZ-80A
4 = MZ-700
5 = MZ-800
6 = MZ-80B
7 = MZ-2000
OFF = オリジナルビデオハードウェアに戻す。
VGA <VGA モード> VGA 互換出力モードを選択。
0 = オリジナル Sharp モード
1 = 640x480 @ 60Hz
2 = 800x600 @ 60Hz。
Z80 なし tranZPUter ボードに搭載されたオリジナルのハード Z80 プロセッサーに切り替え。
ZPU なし FPGA 内の ZPU EVOlution プロセッサーに切り替え、zOS オペレーティングシステムで起動。

80 カラムモード時、ディレクトリ一覧コマンドは 4 列で表示されます。

テープコマンド

TZFS コマンドを通じて Sharp MZ シリーズのすべてのテープフォーマットを読み書きできるようになりました。これは MZ-80B のような他の MZ マシンを所有している場合に非常に便利な機能です。MZ-80B はカセットの入手が難しいですが、ソフトウェアプログラムはバイナリ MZF イメージとして利用可能です。

テープのロード

MZ-700 メモリにテープをロードするには、L、LT または LTNX コマンドを使用できます。L と LT は同一です。LTNX はプログラムをロードしますが実行せず、完了時にロード情報、サイズ、実行アドレスを報告します。

ソーステープのマシンを指定するには、コマンドの後に <ハードウェアモード> オプションを使用します(デフォルト、未指定の場合は MZ-700)。

例:MZ-80B 標準 1800 ボードシステムを使用してテープをロードする場合は次のコマンドを発行します:
    L,B

テープへの保存

MZ-700 メモリから MZ-700 CMT ユニットにテープを保存するには、S または同一の ST コマンドを使用できます。連続したコマンドとして、開始アドレス(MZ-700 メモリ内のプログラムの位置)、終了アドレス(プログラムの最後のアドレス)、実行アドレスを指定します。現在、属性の指定はできず、デフォルトで OBJCD(実行可能)となります。 コマンドを発行するとファイル名の入力が促され、MZF ヘッダーが作成されてプログラムがテープに保存されます。

ターゲットテープのマシンを指定するには、コマンドの後に <ハードウェアモード> オプションを使用します(デフォルト、未指定の場合は MZ-700)。

例:$1200 から $3035 まで、実行アドレス $1200 のプログラムを MZ-80B 用のテープとして保存する場合は次のコマンドを発行します:
    ST120030351200,B

SD ファイルのテープへのコピー

SD カードに保存された MZF ファイルをテープにコピーするには SD2T コマンドを使用します。通常は CD コマンドと DIR コマンドで必要なファイルを探し、そのユニーク番号をコマンドの引数として指定します。

ターゲットテープのマシンを指定するには、コマンドの後に <ハードウェアモード> オプションを使用します(デフォルト、未指定の場合は MZ-700)。

例:SD カード ID「0C」のファイル BASIC MZ-1Z001 を MZ-2000 マシン用にテープにコピーする場合は、テープをカセットドライブに入れて次のコマンドを発行します:
    SD2T0C,2

テープの SD ファイルへのコピー

テープのプログラムを SD カードにコピーするには T2SD コマンドを使用します。通常は CD コマンドでイメージを保存するディレクトリに移動し(ディレクトリごとのファイル上限 255)、このコマンドを実行します。コマンドはテープを検索し、最初に見つかったプログラムをロードして、テープイメージのファイル名で SD カードに保存します。

ターゲットテープのマシンを指定するには、コマンドの後に <ハードウェアモード> オプションを使用します(デフォルト、未指定の場合は MZ-700)。

例:MZ-800 ベースのプログラムを SD カードに保存する場合は、テープをドライブに入れて次のコマンドを発行します:
    T2SD,8
完了するとファイルの詳細と SD カード ID が報告されます。

テープ全体の SD への一括コピー

複数ファイルが保存されたテープや複数のテープがあり、すべてを SD に保存したい場合は T2SDB コマンドを使用します。このコマンドは上記の T2SD と同一ですが、テープからの読み取りと SD への保存をループします。BREAK キーを押すといつでもコマンドを終了できます。

ターゲットテープのマシンを指定するには、コマンドの後に <ハードウェアモード> オプションを使用します(デフォルト、未指定の場合は MZ-700)。

例:MZ-800 テープ全体を SD カードに保存する場合は、テープをドライブに入れて次のコマンドを発行します:
    T2SDB,8
各ファイルが読み取られて保存されるたびに、開始アドレス、サイズ、実行アドレス、保存されたファイル名が出力されます。


Sharp BASIC SA-5510

Rom Filing System のさらなる開発の過程で、SA-5510 BASIC インタープリター(MZ-80A の標準)を逆アセンブルし、RFS の SD カード対応に対応させました。このインタープリターは Sharp MZ-700/800 と互換性があるため、TZFS への移植を決めました。

インタープリターのバイト位置は重要です。一部のプログラムは既知のアドレスにある関数を期待して記述されているため、逆アセンブルは正確である必要があり、変更や拡張はメインプログラムの外で行う必要があります。幸い、TZFS には必要のない自己複製ブロックがインタープリター内にあり、この領域を追加機能のために使用しました。

RFS ではドライブ指定を LOAD/SAVE コマンドに埋め込むことができましたが、TZFS はより強力でそのために SD カードのディレクトリやワイルドカードを指定する個別のコマンドが必要でした。さらに TZFS には CPU クロックなどのいくつかの便利な機能があり、さらなるコマンドの追加が必要でした。

以下の表にコマンド拡張と簡単な説明を示します。
コマンド パラメーター 説明
LOAD ”[<ファイル名>]” 現在の SD カードディレクトリまたは CMT(カセット)で「<ファイル名>」のプログラムを検索。<ファイル名> が指定されない場合、次の連続ファイルをロード。
ファイル名の代わりに TZFS インデックス指定子も使用可能。例:LOAD “1E” は SD カードの HEX 1E の位置に保存されたプログラムをロードします。
SAVE ”[<ファイル名>]” メモリ内のプログラムを「<ファイル名>」という名前で現在の SD カードディレクトリまたは CMT(カセット)に保存。
<ファイル名> が指定されない場合は「DEFAULT<番号>」という名前で保存。<番号> は 0 から始まる連番。
DIR ”[<ワイルドカード>]” TZFS フォーマットで現在の SD カードディレクトリを一覧表示。指定した <ワイルドカード> フィルターを適用。例:DIR M* で M から始まるすべてのプログラムを一覧表示。
CD [<パス>] アクティブな SD ディレクトリを <パス> に変更。<パス> 未指定の場合はルートディレクトリに変更。パスが C の場合(例:CDC)は CMT(カセット)に切り替え。その他の引数は SD カードに切り替え。
FREQ [<周波数>] CPU を指定した <周波数> に変更。<周波数> は KHz で指定。例:10000 = 10MHz。<周波数> 未指定の場合はオリジナルのマザーボード周波数に戻す。
内蔵カセットドライブに LOAD または SAVE するには以下のコマンドを使用します:
    CDC
    LOAD
または
    CDC
    SAVE "EXAMPLE"

新バージョンの BASIC SA-5510 は「BASIC SA-5510-TZ」という名前になっています。

注:ランダムファイルの読み書き BASIC 操作はロジックを完全に理解していないため、まだ完全には実装されていません。分析できる適切なプログラムが入手できれば、CMT 仕様に従って動作するよう TZFS を適合させます。


Microsoft BASIC

Sharp のマシンにはカセットやフロッピーで使用できる複数のバージョンの BASIC がありますが、相互互換性は限定的です(例:MZ80A SA5510 と MZ-700 S-BASIC は異なります)。各マシンには複数のバリアントがあります(例:ディスクドライブ用 SA-6510 や OM-500 のようなサードパーティ版)。これらの BASIC インタープリターのほとんどは、Sharp MZ80K/A/700 向けに設計されている限り TZFS でも動作しますが、CMT(カセット)またはフロッピーストレージのみに限定されます。

既存の BASIC インタープリターの欠点の一つは、TZFS 拡張で更新するためのソースコードの入手可能性です。バイナリを逆アセンブルするか直接バイナリを編集しない限り、TZFS コマンドを追加することはできません。RFS の開発中に同じ問題に直面し、より複雑な tranZPUter ハードウェアデバッグを助ける BASIC が必要だったため、ソースコードが自由に入手できる Microsoft BASIC のバージョン(NASCOM v4.7b)を使用することにしました。 この BASIC バージョンはレトロ界で非常に人気があり、膨大な既存 BASIC プログラムが存在します。また、追加コマンドで拡張するのも比較的簡単です。

インターネット上には NASCOM 4.7b ソースコードが 2 つのバージョンで入手可能です。オリジナルと、LOAD/SAVE/SCREEN などのハードウェア依存コマンドを削除しバイナリ/16 進数変数を追加するように調整された Grant Searle による multicomp プロジェクト向けバージョンです。私はその両方を参照して第三のバージョンを作成し、不足していたテープコマンドを含む利用可能なコマンドを記述・拡張しました。

プロジェクトが発展するにつれ、Microsoft BASIC はさまざまな構成をサポートする必要が生じました。RFS で 5 種類、TZFS で 4 種類です。RFS バージョンを除いて、TZFS を実行する tranZPUter で利用可能なものは以下のとおりです:
  • MS-BASIC(MZ-80A) - オリジナルの 48K ハードウェア。カセットから起動可能。
  • MS-BASIC(MZ-700) - オリジナルの 64K ハードウェア。カセットから起動可能。
  • MS-BASIC(TZFS40) - ビデオアップグレードハードウェアなしの TZFS アップグレード版。
  • MS-BASIC(TZFS80) - 80 カラム表示対応のビデオモジュール FPGA アップグレードを搭載した TZFS アップグレード版。

それぞれが TZFS ドライブに表示されるので、ハードウェアと用途に合わせて使用してください。標準コマンドと関数については、オリジナルの NASCOM Basic Manual を参照してください。以下の表は MZ-80A Rom Disk ハードウェアに合わせて追加した拡張機能の概要です。

コマンド パラメーター 説明
CLOAD ”<ファイル名>” SD カードからカセットイメージ(トークン化された BASIC プログラム)をロード。
CSAVE ”<ファイル名>” 現在の BASIC プログラムをトークン化されたカセットイメージ形式で SD カードに保存。
LOAD ”<ファイル名>” 標準 ASCII テキスト BASIC プログラムを SD カードからロード。
SAVE ”<ファイル名>” 現在の BASIC プログラムを ASCII テキスト形式で SD カードに保存。
DIR <ワイルドカード> 指定したワイルドカードを使用して現在のディレクトリを一覧表示。
CD <FAT32 パス> 作業ディレクトリを指定したパスに変更。以降のすべてのコマンドはこのディレクトリを使用します。起動時、CLOAD/CSAVE のデフォルトは 0:\CAS、LOAD/SAVE のデフォルトは 0:\BAS ですが、このコマンドで両方が指定ディレクトリを使用するよう統一されます。デフォルトに戻すにはパスなしで CD と入力。
FREQ <周波数(KHz)> CPU を指定した KHz 周波数に設定。デフォルトのマザーボード周波数に切り替えるには 0 を使用。テスト済み範囲は 100KHz から 24MHz(使用する Z80 に依存)。Z80 が対応していればオーバークロック可能。
ANSITERM 0 = オフ、1 = オン 組み込みの ANSI ターミナルプロセッサーを無効化または有効化(デフォルト)。これは ANSI エスケープシーケンスを認識して画面操作に変換します。これにより、専用の画面コマンドに依存しないポータブルな BASIC プログラムを使用できます。参考:Star Trek V2 BASIC プログラムは ANSI エスケープシーケンスを使用しています。
NASCOM カセットイメージコンバーターツール
NASCOM BASIC プログラムはインターネット上でカセットイメージファイルとして見つかります。これらのファイルにはトークン化された BASIC コードが埋め込まれたテープフォーマットデータが含まれています。これらのファイルを使用できるようにするため、テープフォーマットデータを取り除いて BASIC コードを再構成するコンバータープログラムを作成しました。また、このバージョンの BASIC は新しいコマンドをサポートするよう拡張されているためトークン値が変わっており、このプログラムは変換時にトークン値を自動的に更新します。

コンバーターはコマンドラインで動作するよう設計されており、その書式は次のとおりです:

NASCONV v1.0

必須:-
  -i | --image <file>      変換するイメージファイル。
  -o | --output <file>     変換後のデータの出力先ファイル。

オプション:-
  -l | --loadaddr <addr>   MZ80A BASIC の開始アドレス。NASCOM アドレスを使用して正しい MZ80A アドレスを設定。
  -n | --nasaddr <addr>    オリジナルの NASCOM BASIC 開始アドレス。
  -h | --help              このヘルプテキスト。
  -v | --verbose           詳細なメッセージを出力します。

使用例:
  nasconv --image 3dnc.cas --output 3dnc.bas --nasaddr 0x10fa --loadaddr 0x4341    ファイル 3dnc.cas を NASCOM カセット形式から変換。

tranZPUter SW-700 ソフトウェアのビルド

tranZPUter SW-700 ボードの動作には複数のソフトウェアコンポーネントが必要です:

  • zOS 組み込み版 - K64F I/O プロセッサー上で動作する内蔵オペレーティングシステム
  • zOS ユーザー版 - Sharp MZ-700 のメインホストプロセッサーとして動作する ZPU Evo 用オペレーティングシステム
  • TZFS - Sharp MZ-700 上で動作する Z80 ベースのオペレーティングシステム/ファイリングシステム
  • CP/M - Sharp MZ-700 に移植したマイクロコンピューター用の本格的なオペレーティングシステム。膨大なアプリケーションが存在します。

ソフトウェアのビルドにはそれぞれ異なる手順が必要で、以下のセクションで説明します。


パス

読みやすくするため、以下の省略名はこの章内の対応するパスを指します。主要な tranZPUter リポジトリと、オペレーティングシステム用の zSoft の 2 つのリポジトリを使用します。

zSoft リポジトリ(zOS)

省略名 パス 説明
[<絶対パス>]   このリポジトリをシステム上に展開したパス。
<zsoft> [<絶対パス>]/zsoft/ zSoft ソフトウェアのルートディレクトリ。
<z-apps> [<絶対パス>]/zsoft/apps アプリケーションディレクトリ。すべての zOS/ZPUTA アプリケーションとそのメイクファイルがここにあります。
<z-build> [<絶対パス>]/zsoft/build コンパイル済みソフトウェアの出力先ディレクトリ。例:<z-build>/SD には SD カードに書き込むすべてのファイルが含まれます。
<z-common> [<絶対パス>]/zsoft/common ライブラリとしてアセンブルされない共通の C/C++ メソッド。
<z-libraries> [<絶対パス>]/zsoft/libraries C/C++ ライブラリ。通常は C/C++ インストールの一部ですが、組み込み作業、特に ZPU では個別に作成が必要です。
<z-teensy3> [<絶対パス>]/zsoft/teensy3 K64F ベースの Teensy 3.5 ソフトウェア。一部は zOS の K64F バージョンで使用されます。豊富なライブラリを持ち、K64F プログラムに容易に追加できます。
<z-include> [<絶対パス>]/zsoft/include 共通インクルードヘッダーファイル。
<z-startup> [<絶対パス>]/zsoft/startup 組み込みプロセッサーの起動ファイル(主にアセンブラー)。テンプレートとマクロを使用して正しいターゲットのメモリモデル起動コードを作成します。
<z-iocp> [<絶対パス>]/zsoft/iocp IO 制御プログラム。ZPU 上でアプリケーションをブートストラップするための初期ブートローダー。
<z-zOS> [<絶対パス>]/zsoft/zOS zOS のソースコード。異なるターゲット CPU 向けにパラメーター化されています。
<z-zputa> [<絶対パス>]/zsoft/zputa ZPUTA のソースコード。異なるターゲット CPU 向けにパラメーター化されています。
<z-rtl> [<絶対パス>]/zsoft/rtl レジスタ転送レベルファイル。ZPU ターゲットプロジェクトのビルド時に必要な、生成されたメモリ定義および初期化ファイル。
<z-docs> [<絶対パス>]/zsoft/docs ソフトウェアの関連ドキュメント。
<z-tools> [<絶対パス>]/zsoft/tools コンパイルとターゲットファイル作成を補助するツール。

tranZPUter リポジトリ

省略名 パス 説明
<cpu> [<絶対パス>]/tranZPUter/cpu ZPU VHDL 定義ファイル。
<build> [<絶対パス>]/tranZPUter/build ZPU ベースの tranZPUter ボードの開発およびテスト用ビルドファイル。
<devices> [<絶対パス>]/tranZPUter/devices ZPU 開発または tranZPUter 開発で使用するハードウェアデバイスの RTL 定義。
<docs> [<絶対パス>]/tranZPUter/docs プロジェクトの関連ドキュメント。
<pcb> [<絶対パス>]/tranZPUter/pcb Gerber ファイル。各 tranZPUter バージョン(SW、SW-700、tranZPUter)が独自のサブディレクトリ内にあります。
<schematics> [<絶対パス>]/tranZPUter/schematics Kicad の回路図および PCB 設計ファイル(コンポーネントライブラリ定義を含む)。
<software> [<絶対パス>]/tranZPUter/software プロジェクトで使用するソフトウェアのルートディレクトリ。
<tools> [<絶対パス>]/tranZPUter/software/tools コンパイルとターゲットファイル作成を補助するツール。
<asm> [<絶対パス>]/tranZPUter/software/asm TZFS、CP/M、各種オリジナルモニター ROM の Z80 アセンブラーファイル。
<roms> [<絶対パス>]/tranZPUter/software/roms Z80 ソースをアセンブルして作成した ROM ファイル。
<srctools> [<絶対パス>]/tranZPUter/software/src/tools tranZPUter v1 Flash RAM メモリマップデコーダーファイル作成ツールおよび NASCOM Basic コンバーターツール。
<cpm> [<絶対パス>]/tranZPUter/software/CPM オリジナルの CPM ソフトウェア。アプリケーションごとにグループ化され、生成されたフロッピーディスクおよび SD カードイメージを含みます。
<mzf> [<絶対パス>]/tranZPUter/software/MZF 生成された SD カードイメージに追加されるオリジナルの Sharp MZF フォーマットアプリケーション。
<bas> [<絶対パス>]/tranZPUter/software/BAS 読み取り可能なテキスト形式に変換された NASCOM Basic プログラムのコレクション。生成された SD カードイメージに追加されます。
<cas> [<絶対パス>]/tranZPUter/software/CAS NASCOM テープイメージから変換されたトークン化された NASCOM Basic テーププログラムのコレクション。生成された SD カードイメージに追加されます。
<cas> [<絶対パス>]/tranZPUter/software/NASCAS 未変換のオリジナル NASCOM カセットイメージのコレクション。変換には nasconv ツールを使用してください。
<config> [<絶対パス>]/tranZPUter/software/config ツールの設定ファイル。現在は CP/M イメージ生成用のディスク定義記述ファイル。

ツール


すべての開発は Linux(具体的には Debian/Ubuntu)上で行われています。CP/M Tools の GUI バージョンには Windows を使用していますが、Windows での TZFS のビルドには時間をかけていません。将来的には必要なツールがすべてインストールされた Docker イメージを作成する予定ですが、それまでの間、Z80 コードのアセンブル、C プログラムのコンパイル、CP/M ソフトウェアと CP/M ディスクイメージの操作のために以下のツールを入手してインストールする必要があります。

注:K64F 向けの ARM 互換ツールチェーンは現在、リポジトリのビルドツリー内に保存されています。

   
ZPU GCC ToolChain ZPU 開発用 GCC ツールチェーン。/opt などの共通エリアにインストール。
Arduino Arduino 開発環境。Arduino の豊富なライブラリから zOS の K64F バージョンに機能を追加する場合を除き、実際には不要で参照用です。
Teensyduino Arduino レベルで Teensy3.5 ボードを操作するための Teensy3 Arduino 拡張。実際には不要で参照用です。
Z80 Glass Assembler アセンブリファイルをマシンコードに変換する Z80 アセンブラー。0.5 リリースのバグ(位置 0xFFFF にバイトを作成できない)を修正した版がリポジトリの <tools> ディレクトリに保存されています。
samdisk マルチ OS 対応のコマンドラインベース低レベルディスク操作ツール。
cpmtools マルチ OS 対応のコマンドライン CP/M ディスク操作ツール。
CPMToolsGUI Windows ベースの GUI CP/M ディスク操作ツール。
z88dk Z80 CPU 向けの優れた C 開発キット。
sdcc もう一つの優れた小型デバイス C コンパイラー。Z80 もターゲットの一つです。z88dk はこのツールの拡張(Z80 向け)バージョンをパッケージ内に提供しています。

zOS(組み込み版)のビルド

K64F I/O プロセッサー内の組み込み OS として zOS をビルドするには、zOS ビルドセクションを参照してください。

典型的なビルドコマンドは以下のとおりです:

build.sh -C K64F -O zos  -N 0x10000 -d -T

これは 64K のプライマリヒープ(-N 0x10000)を持ち、tranZPUter 拡張(-T)を追加した K64F プロセッサー向け zOS イメージをビルドします。

出力ファイルは <z-zOS>/main.hex となり、tranZPUter ボードの K64F CPU にアップロードできます。


zOS(ユーザー版)のビルド

Sharp MZ-700 のメインプロセッサーとして動作する ZPU Evo 上で動作するユーザー OS として zOS をビルドするには、zOS に関する情報は zOS ビルドセクションを、ビルドの詳細は以下を参照してください。

ハードウェア上、ZPU Evo には FPGA 内に 128K の高速 32 ビット RAM と tranZPUter ボード上に 512K の 8 ビット RAM が割り当てられています。典型的なビルドコマンドは以下のとおりです:

build.sh -C EVO -O zos -o 0 -M 0x1FD80 -B 0x0000 -S 0x3D80 -N 0x4000 -A 0x100000 -a 0x80000 -n 0x0000 -s 0x0000 -d -Z

これは 16K のプライマリヒープ(-N 0x4000)、15K のスタック(-S 0x3D80)を持ち、SharpMZ ハードウェアドライバー拡張(-Z)を追加した ZPU プロセッサー向け zOS イメージをビルドします。注意点として、RAM の上限 -M 0x1FD80 は重要で、0x1FD80:0x1FFFF のスペースは ZPU と K64F I/O プロセッサー間のプロセッサー間通信ブロックとして使用されます。

出力ファイルは <z-zOS>/main.bin となり、SD カードの /ZOS/ZOS.rom としてコピーします。


TZFS のビルド

リポジトリをクローンし、提供されているシェルスクリプトとバイナリを実行することでソフトウェアと最終ロードイメージをビルドできます。

TZFS は以下の手順でビルドします:

  1. <tools>/assemble_tzfs.sh を使用して TZFS バイナリを作成。これにより、メインコードとバンクコードをすべて含む ROM イメージ <roms>/tzfs.rom が生成されます。
  2. <tools>/assemble_roms.sh を使用してオリジナルの MZ80A/MZ-700 モニター ROM を作成。これにより <roms>/monitor_SA1510.rom、<roms>/monitor_80c_SA1510.rom、<roms>/monitor_1Z-013A.rom および <roms>/monitor_80c_1Z-013A.rom が生成されます。
  3. 必要な Sharp MZF ファイルを MZF ディレクトリへコピーおよび/または削除。
  4. ファイルを SD カードにコピー。

典型的なビルドステージについてはこちらを参照してください。


CP/M のビルド

CP/M のビルドについては追加情報が CP/M ビルドセクションにあります。

tranZPUter 向けの CP/M バージョンは、特別な SD カードのセットアップやコンパクトな ROM イメージの作成が不要なため、ビルドはやや簡単です。

CP/M システムは 4 つのパートでビルドされます:

1. CCP、BDOS、CBIOS スタブを含む cpm22.bin。
2. 0xF000:FFFF に位置する 4K ページを主なソースとし、
   別の 64K RAM ブロックに置かれた最大 48K のページからなるバンク化された CBIOS。
3. 1 + 2 + MZF ヘッダーを TZFS がロードできる MZF フォーマットファイルとして結合。
4. K64F SD カード上に 16MB FAT32 ファイルとして保存された CPM ディスクドライブの作成。

上記のすべては「assemble_cpm.sh」と「make_cpmdisks.sh」の 2 つの bash スクリプトにエンコードされており、以下のように実行できます:

cd <software>
tools/assemble_cpm.sh
tools/make_cpmdisks.sh

CPM ディスクイメージは、生のイメージは <cpm>/1M44/RAW に、CPC 拡張フォーマットのディスクイメージは <cpm>/1M44/DSK にあります。これらのイメージは <cpm> 内の各ディレクトリから構築されており、CPM* で始まる各ディレクトリが 1 つの 1.44MB ドライブイメージにパッケージされます。なお、各ディレクトリは対応するディレクトリ内の他のすべてのサポートされているディスクイメージにもパッケージされます(例:16MB SD カードドライブイメージ用の <cpm>/SDC16M)。

SD カード上のファイルとして存在する CPM ディスクは <CPM>/SDC16M/RAW に保存され、CPMDSK<番号>.RAW の形式を持ちます(<番号> は 00、01 … n で、CP/M 配下で接続されるディスクドライブに対応)。標準ブートでは 00 = ドライブ A、01 = ドライブ B 等。フロッピーディスクコントローラーが優先される場合は 00 = ドライブ C、01 = ドライブ D。通常の CP/M 実行時には最大 6 ドライブが接続されます(接続は動的だが利用可能なメモリに制限されます)。


典型的なビルド手順

ソフトウェアのビルド、SD カードの作成、インストールの手順を簡潔にまとめます。

<a name="obtain-an-sd-card-and-partition-into-2-dos-fat32-formatted-partitions-mount-them-as-and-the-partition-size-should-be-at-least-512mb-each" id="obtain-an-sd-card-and-partition-into-2-dos-fat32-formatted-partitions-mount-them-as-and-the-partition-size-should-be-at-least-512mb-each"></a>
# SD カードを入手し、2 つの DOS FAT32 フォーマットパーティションに分割して <SD CARD P1> と <SD CARD P2> としてマウント。パーティションサイズはそれぞれ最低 512MB 必要。
<a name="the-first-partition-will-host-the-software-to-run-on-the-k64f-io-processor-and-all-the-sharp-mz-software-to-be-accessed-by-the-sharp-mz-700" id="the-first-partition-will-host-the-software-to-run-on-the-k64f-io-processor-and-all-the-sharp-mz-software-to-be-accessed-by-the-sharp-mz-700"></a>
# 最初のパーティションは K64F I/O プロセッサーで動作するソフトウェアと Sharp MZ-700 がアクセスするすべての Sharp MZ ソフトウェアをホストします。
<a name="the-second-partition-will-host-the-software-to-run-on-the-zpu-evo-processor-when-it-acts-as-the-main-sharp-mz-700-processor" id="the-second-partition-will-host-the-software-to-run-on-the-zpu-evo-processor-when-it-acts-as-the-main-sharp-mz-700-processor"></a>
# 2 番目のパーティションは ZPU Evo プロセッサーが Sharp MZ-700 のメインプロセッサーとして動作する際のソフトウェアをホストします。

<a name="build-zos-embedded" id="build-zos-embedded"></a>
# zOS(組み込み版)のビルド
cd <zsoft>
./build.sh -C K64F -O zos  -N 0x10000 -d -T
<a name="flash-mainhex-into-the-k64f-processor-via-usb-or-opensda" id="flash-mainhex-into-the-k64f-processor-via-usb-or-opensda"></a>
# USB または OpenSDA 経由で <z-zOS>/main.hex を K64F プロセッサーにフラッシュ。
cp -r build/SD/* <SD CARD P1>/

<a name="build-zos-user" id="build-zos-user"></a>
# zOS(ユーザー版)のビルド
./build.sh -C EVO -O zos -o 0 -M 0x1FD80 -B 0x0000 -S 0x3D80 -N 0x4000 -A 0x100000 -a 0x80000 -n 0x0000 -s 0x0000 -d -Z
cp -r build/SD/* <SD CARD P2>/
<a name="ensure-that-the-zpu-zos-kernel-is-copied-to-the-k64f-partition-as-it-will-be-used-for-loading-into-the-zpu-evo-on-reset" id="ensure-that-the-zpu-zos-kernel-is-copied-to-the-k64f-partition-as-it-will-be-used-for-loading-into-the-zpu-evo-on-reset"></a>
# ZPU zOS カーネルを K64F パーティションにコピー(リセット時に ZPU Evo へのロードに使用)。
cp -rbuild/SD/ZOS/* <SD CARD P1>/ZOS/

<a name="build-tzfs" id="build-tzfs"></a>
# TZFS のビルド
cd <software>
tools/assemble_tzfs.sh
<a name="build-the-required-host-sharp-roms" id="build-the-required-host-sharp-roms"></a>
# 必要なホスト(Sharp)ROM のビルド。
tools/assemble_roms.sh
<a name="build-cpm" id="build-cpm"></a>
# CP/M のビルド
tools/assemble_cpm.sh
<a name="build-the-cpm-disks" id="build-the-cpm-disks"></a>
# CPM ディスクのビルド
tools/make_cpmdisks.sh

<a name="create-the-target-directories-on-the-sd-card-1st-partition-and-copy-all-the-necessary-applications-and-roms" id="create-the-target-directories-on-the-sd-card-1st-partition-and-copy-all-the-necessary-applications-and-roms"></a>
# SD カード第 1 パーティションにターゲットディレクトリを作成し、必要なアプリケーションと ROM をすべてコピー。
mkdir -p <SD CARD P1>/TZFS/
mkdir -p <SD CARD P1>/MZF/
mkdir -p <SD CARD P1>/CPM/
mkdir -p <SD CARD P1>/BAS
mkdir -p <SD CARD P1>/CAS
cp <software>/roms/tzfs.rom                   <SD CARD P1>/TZFS/
cp <software>/roms/monitor_SA1510.rom         <SD CARD P1>/TZFS/SA1510.rom
cp <software>/roms/monitor_80c_SA1510.rom     <SD CARD P1>/TZFS/SA1510-8.rom
cp <software>/roms/monitor_1Z-013A.rom        <SD CARD P1>/TZFS/1Z-013A.rom
cp <software>/roms/monitor_80c_1Z-013A.rom    <SD CARD P1>/TZFS/1Z-013A-8.rom
cp <software>/roms/monitor_1Z-013A-KM.rom     <SD CARD P1>/TZFS/1Z-013A-KM.rom
cp <software>/roms/monitor_80c_1Z-013A-KM.rom <SD CARD P1>/TZFS/1Z-013A-KM-8.rom
cp <software>/roms/MZ80B_IPL.rom              <SD CARD P1>/TZFS/MZ80B_IPL.rom
cp <software>/MZF/CPM223.MZF                  <SD CARD P1>/MZF/
cp <software>/roms/cpm22.bin                  <SD CARD P1>/CPM/
cp <software>/CPM/SDC16M/RAW/*                <SD CARD P1>/CPM/
cp <software>/MZF/*                           <SD CARD P1>/MZF/
cp <software>/BAS/*                           <SD CARD P1>/BAS/
cp <software>/CAS/*                           <SD CARD P1>/CAS/

<a name="if-you-want-tzfs-to-autostart-create-an-empty-flag-file-as-follows" id="if-you-want-tzfs-to-autostart-create-an-empty-flag-file-as-follows"></a>
# TZFS を自動起動したい場合は以下のように空のフラグファイルを作成。
> <SD CARD P1>/TZFSBOOT.FLG

<a name="if-you-want-to-run-tzfs-commands-on-each-boot-create-an-autoexecbat-file-and-place-required-commands-into-the-file" id="if-you-want-to-run-tzfs-commands-on-each-boot-create-an-autoexecbat-file-and-place-required-commands-into-the-file"></a>
# 起動時に TZFS コマンドを実行したい場合は autoexec.bat ファイルを作成して必要なコマンドを記述。
> <SD CARD P1>/AUTOEXEC.BAT

<a name="eject-the-card-and-insert-it-into-the-sd-card-reader-on-the-tranzputer-board" id="eject-the-card-and-insert-it-into-the-sd-card-reader-on-the-tranzputer-board"></a>
# カードを取り出して tranZPUter ボードの SD カードリーダーに挿入。
<a name="remove-the-z80-from-the-sharp-mz-machine-and-install-the-tranzputer-board-into-the-z80-socket" id="remove-the-z80-from-the-sharp-mz-machine-and-install-the-tranzputer-board-into-the-z80-socket"></a>
# Sharp MZ マシンから Z80 を取り外し、tranZPUter ボードを Z80 ソケットに取り付け。
<a name="power-on-if-the-autostart-flag-has-been-created-you-should-see-the-familiar-monitor" id="power-on-if-the-autostart-flag-has-been-created-you-should-see-the-familiar-monitor"></a>
# 電源を入れる。自動起動フラグが作成されていれば、おなじみのモニター
<a name="signon-message-followed-by-tzfs-if-the-autostart-flag-hasnt-been-created-enter-the-command" id="signon-message-followed-by-tzfs-if-the-autostart-flag-hasnt-been-created-enter-the-command"></a>
# サインオンメッセージに続いて +TZFS が表示されます。自動起動フラグがない場合は、
<a name="je800-into-the-monitor-to-initialise-tzfs" id="je800-into-the-monitor-to-initialise-tzfs"></a>
# モニターに JE800 コマンドを入力して TZFS を初期化してください。

ソフトウェアのビルドと SD カードの準備を支援するために、<zSoft>/buildall というスクリプトを使用しています。これを使用するには ROOT_DIR を変更し、RSYNC を無効にする必要があります(リモートコンピューターでコンパイルして K64F にアップロードするため)。

エラーが発生した場合、スクリプトは適切なエラーメッセージとともに中断します。


K64F MPU のフラッシュ

オリジナルの tranZPUter SW は PJRC の優れた Teensy 開発ボードを使用していましたが、後の tranZPUter SW リリースでは Freescale K64FX512 プロセッサーの 100 ピン TQFP バージョンに置き換えられました。

K64FX512 プロセッサーをプログラムするために PJRC が開発した方法は非常にシンプルなため、迅速な開発のために tranZPUter SW-700 ボードに PJRC ブート MCU と OpenSDA JTAG 方式の両方を搭載しました。ボード組み立て時に PJRC ブート MCU(U6)を取り付けて JP1-5 のジャンパーピン 1-2 を設定すれば、PJRC の Teensy Tool を使用して USB 経由で K64F をプログラムできます。U6 が未搭載の場合は、SWD プロトコルを使用して JTAG ポートに接続した OpenSDA プログラマー経由でプログラムします。この場合、JP1-4 のジャンパーピン 2-3 と JP5 のピン 1-2 を接続してください。

Teensy Tool を使用したプログラミングに必要なすべてのファイルと実行ファイルは、zSoft リポジトリの <z-tools> ディレクトリにあります。

tranZPUter カードに PJRC ブート MCU が取り付けられている場合、以下の手順で K64F をプログラムします:
1. USB ケーブルで tranZPUter SW-700 ボードを PC に接続。
2. Teensy プログラミングアプリケーションを起動:
   <z-soft>/teensy
3. Teensy アプリケーションで「ファイル」→「HEX ファイルを開く」を選択し、<z-zOS> または \z<zputa> ディレクトリ(アップロードする OS に応じて)に移動して「main.hex」ファイルを選択。
4. tranZPUter SW-700 ボードの「K64F PROG」ボタンを押す。
5. Teensy アプリケーションで「操作」→「プログラム」を選択 — これでオンボード Flash RAM がプログラムされます。
6. 仮想シリアルデバイスに設定されたターミナルエミュレーターが開いていることを確認(不明な場合は Linux で「dmesg」コマンドを実行して最新の USB 接続とその名前を確認)。通常デバイスは /dev/ttyACM0。ボーレートやビット/パリティを設定する必要はありません(これは仮想シリアルポートで USB 速度で動作します)。
7. Teensy アプリケーションで「操作」→「再起動」を選択 — K64F が再起動し、zOS または ZPUTA が起動します。
8. ターミナルエミュレーター経由で OS を操作。

U6 が搭載されている場合の Teensy プログラミングツールの詳細については、Teensy の基本的な使い方ガイドを参照してください。

zOS v1.2 以降向けに zOS アプリケーションが開発中で、SD カードに保存された新しいファームウェアを zOS コンソール経由で K64F にフラッシュできるようになります。PJRC ブート MCU または OpenSDA デバイスが必要な K64F の初回プログラミングを除き、その後のファームウェアアップロードはこのツールで行うことができます。

部品表(BOM)

tranZPUter SW-700 v1.3 ボードの製造コストを以下の表に示します。はんだペーストやフラックスなどの消耗品は含まれていません。表の全詳細を確認するには右にスクロールしてください。

ソース: tranZPUter-SW-700_v1_3.sch
コンポーネント数: 145

部品番号 数量 単価 10個価格 100個価格 5個合計価格 10個価格 コンポーネント名 フットプリント 説明 ベンダー
C1, C2, C3, C4, C5, C6, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26, C27, C28, C29, C30, C31, C32, C33, C34, C35, C36, C37, C38, C39, C40, C41, C42, C43, C44, C45, C46, C47, C48, C49, C50, C51, C52, C53, C54, C55, C56, C57, C58, C59 (省略:各部品番号については原文の BOM テーブルを参照) 100nF C_Small Capacitor_SMD:C_0805_2012Metric_Pad1.15x1.40mm_HandSolder コンデンサー
C7, 1 0.094 0.016   0.094 0.016 10uF C_Small Capacitor_SMD:C_0805_2012Metric_Pad1.15x1.40mm_HandSolder コンデンサー(小型シンボル) https://www.mouser.co.uk/ProductDetail/581-0805B106K160CT
C60, C61, C62, C63, 4 0.108 0.108   0.432 0.432 10uF C_Small Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolder コンデンサー(小型シンボル) https://uk.rs-online.com/web/p/mlccs-multilayer-ceramic-capacitors/1845759
C64, C65, 2 0.132 0.054   0.264 0.108 100nF C_Small Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolder コンデンサー(小型シンボル) https://www.mouser.co.uk/ProductDetail/963-EMK316B7104KL-T
C66, C67, 2 0.462 0.462   0.924 0.924 100uF CP_Small Capacitor_SMD:CP_Elec_8x10.5 電解コンデンサー(小型シンボル) https://uk.rs-online.com/web/p/aluminium-capacitors/7088028
C68, C69, 2 0.12 0.12   0.24 0.24 22pF C_Small Capacitor_SMD:C_0805_2012Metric_Pad1.15x1.40mm_HandSolder コンデンサー(小型シンボル) https://www.mouser.co.uk/ProductDetail/581-0805CG220J500NT
C70, C71, C72, C73, 4 0.042 0.01   0.168 0.04 15pF C_Small Capacitor_SMD:C_0805_2012Metric_Pad1.15x1.40mm_HandSolder コンデンサー(小型シンボル) https://www.mouser.co.uk/ProductDetail/581-0805CG150J500T
D1, D2, D3, D4, 4 0.224 0.224   0.896 0.896 LED LED_Small LED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolder 発光ダイオード(小型シンボル) https://www.ebay.co.uk/itm/362279820217
D5, D6, 2 0.076 0.076   0.152 0.152 D_Schottky D_Small Diode_SMD:D_SOD-323_HandSoldering ショットキーダイオード https://uk.rs-online.com/web/p/schottky-diodes-rectifiers/8229886/
D7, D8, 2 0.11 0.11   0.22 0.22 3.3V D_Zener_Small Diode_SMD:D_SOD-323_HandSoldering ツェナーダイオード https://uk.rs-online.com/web/p/zener-diodes/7390028/
FB1, FB2, FB3, 3 0.058 0.02   0.174 0.06 Ferrite_Bead_Small Ferrite_Bead_Small Inductor_SMD:L_0805_2012Metric_Pad1.15x1.40mm_HandSolder フェライトビード(小型シンボル) https://www.mouser.co.uk/ProductDetail/875-MI0805K601R-10
J1, 1 2.05 2.05   2.05 2.05 Conn_02x20_Odd_Even Conn_02x20_Odd_Even Connector_PinHeader_2.54mm:PinHeader_2x20_P2.54mm_Vertical コネクター、2x20 列 https://uk.rs-online.com/web/p/pcb-headers/2518434/
J2, 1 0.896 0.896   0.896 0.896 Conn_01x06 Conn_01x06 Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical コネクター、1x06 列 https://uk.rs-online.com/web/p/pcb-headers/2518339
J3, 1 0.896 0.896   0.896 0.896 Conn_01x06 Conn_01x06 Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical コネクター、1x06 列 https://uk.rs-online.com/web/p/pcb-headers/2518339
J4, J5, 2 2.6 2.6   5.2 5.2 Micro_SD_Card_Det Micro_SD_Card_Det MZ80FPGA:Micro_SD_MO-500-0008-R micro SD カード検出付き https://www.ebay.co.uk/itm/401453219266?hash=item5d792e59a2:g:IrYAAOSwNFpa6Izw
J6, 1 1.3 1.3   1.3 1.3 USB_B_Micro USB_B_Micro Connector_USB:USB_Micro-B_Amphenol_10118194_Horizontal USB Micro-B コネクター、水平実装 https://uk.rs-online.com/web/p/usb-connectors/1355757
J7, 1 0.896 0.896   0.896 0.896 Conn_01x04 Conn_01x04 Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical コネクター、1x04 列 https://uk.rs-online.com/web/p/pcb-headers/2518338
JP1, JP2, JP3, JP4, JP5, 5 0.152 0.152   0.76 0.76 SolderJumper_3_Bridged12 SolderJumper_3_Bridged12 Jumper:SolderJumper-3_P1.3mm_Bridged12_Pad1.0x1.5mm ハンダジャンパー
L1, 1 0.254 0.254   0.254 0.254 2.2uH L_Small Inductor_SMD:L_0805_2012Metric_Pad1.15x1.40mm_HandSolder インダクター(小型シンボル) https://www.mouser.co.uk/ProductDetail/652-SDL0805T-2R2M1R8
R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, 21 0.077 0.015   1.617 0.315 10K R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/603-RC0805JR-0710KL
R24, R25, R26, R29, R30, R31, 6 0.077 0.007   0.462 0.042 1K R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/603-RC0805JR-071KL
R33, R28, R23, 3 0.122 0.028   0.366 0.084 4K4 R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/603-AC0805FR-074K42L
R35, R34, R36, 3 0.077 0.013   0.231 0.039 120R R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/652-CR0805FX-1200ELF
R37, 1 0.084 0.02   0.084 0.02 3K9 R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/603-RC0805JR-103K9L
R38, R32, R27, R22, 4 0.077 0.007   0.308 0.028 2K2 R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/652-CR0805JW-222ELF
R43, R44, 2 0.077 0.03   0.154 0.06 68R R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/71-CRCW080568R0JNEA
R46, 1 0.077 0.048   0.077 0.048 25R R_Small Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder 抵抗器(小型シンボル) https://www.mouser.co.uk/ProductDetail/Vishay-Dale/CRCW080525R5FKEA?qs=sGAEpiMZZMukHu%252BjC5l7YbcFGEobT%252Bl8hOgQhIcVvUs%3D
SW1, 1 0.083 0.083   0.083 0.083 K64 PROG SW_Push Button_Switch_SMD:SW_SPST_B3S-1000 プッシュボタンスイッチ、汎用、2ピン https://uk.rs-online.com/web/p/tactile-switches/1769532/
U1, 1 5.54 4.51   5.54 4.51 CY62148ELL-45ZSXI CY62148ELL-45ZSXI Package_SO:TSOP-II-32_21.0x10.2mm_P1.27mm 512K x 8 低消費電力 CMOS RAM、TSOPII https://uk.rs-online.com/web/p/sram/1242940/
U2, 1 2.078 2.078   2.078 2.078 Z80CPU Z80CPU Package_DIP:DIP-40_W15.24mm_Socket 8ビット汎用マイクロプロセッサー、DIP-40 https://www.ebay.co.uk/itm/321810149944
U3, 1 1.504 1.504   1.504 1.504 EXTENDER Z80CPU_EXTENDER2 MZ80FPGA:DIP-40_W15.24mm_Extender_NoCourtyard 8ビット汎用マイクロプロセッサー、DIP-40 https://uk.rs-online.com/web/p/pcb-headers/6742309/
U4, 1 7.02 7.02   7.02 7.02 EPM7512AEQFP144 EPM7512AEQFP144-7 Package_QFP:TQFP-144_20x20mm_P0.5mm Altera MAX7000S CPLD、160MC https://www.ebay.co.uk/itm/123874645591
U5, 1 38.14 38.14   38.14 38.14 EP4CE75F484I7 EP4CE75F484I7-2 Package_BGA:BGA-484_23.0x23.0mm_Layout22x22_P1.0mm https://www.ebay.co.uk/itm/372308134931
U6, 1   0 0 MKL02Z32VFG4 MKL02Z32VFG4 Package_DFN_QFN:QFN-16-1EP_3x3mm_P0.5mm_EP1.75x1.75mm
U7, 1 1.533333 1.533333   1.533333 1.533333 EPCS64 EPCS64 Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm https://www.ebay.co.uk/itm/123874645591
U8, 1 12.084 10.092   12.084 10.092 K64FX512 K64FX512-100 Package_QFP:LQFP-100_14x14mm_P0.5mm https://uk.farnell.com/nxp/mk64fx512vll12/mpu-arm-cortex-m4-120mhz-lqfp/dp/2776003
U9, U11, 2 0.234 0.234   0.468 0.468 AMS1117-3.3 AMS1117-3.3 Package_TO_SOT_SMD:SOT-223-3_TabPin2 1A 低ドロップアウトレギュレーター、正極、3.3V 固定出力、SOT-223 https://www.ebay.co.uk/itm/264452555404
U10, 1 0.234 0.234   0.234 0.234 AMS1117-2.5 AMS1117-2.5 Package_TO_SOT_SMD:SOT-223-3_TabPin2 1A 低ドロップアウトレギュレーター、正極、2.5V 固定出力、SOT-223 https://www.ebay.co.uk/itm/264452555404
U12, 1 0.234 0.234   0.234 0.234 AMS1117-1.2 AMS1117 Package_TO_SOT_SMD:SOT-223-3_TabPin2 1A 低ドロップアウトレギュレーター、正極、可変出力、SOT-223 https://www.ebay.co.uk/itm/264452555404
X1, 1 1.398 1.398   1.398 1.398 50MHz ASE-xxxMHz Oscillator:Oscillator_SMD_Abracon_ASE-4Pin_3.2x2.5mm 3.3V CMOS SMD 水晶クロックオシレーター、Abracon https://uk.rs-online.com/web/p/mems-oscillators/1712828/
Y1, 1 0.526 0.526   0.526 0.526 32.768KHz Crystal_Small Crystal:Crystal_SMD_2012-2Pin_2.0x1.2mm_HandSoldering 2ピン水晶(小型シンボル) https://uk.rs-online.com/web/p/crystal-units/1753472/
Y2, 1 0.442 0.418   0.442 0.418 16MHz Crystal_Small Crystal:Crystal_SMD_Abracon_ABM8G-4Pin_3.2x2.5mm 2ピン水晶(小型シンボル) https://www.mouser.co.uk/ProductDetail/815-ABM3-16-B2-T
アルミヒートシンク 2 1.79 1.79   3.58 3.58 19x19x3mm https://www.ebay.co.uk/itm/254174392651
PCB - PCBWay 1 21.351 21.351   21.351 21.351
小計 127.96 121.48
送料 5 5
消費税 20% 25.59201 24.29601
合計(GBP) 158.552 150.776
1 個あたりの価格は、一部のコンポーネントが 10/50/100 個単位でしか購入できないため、実際を反映していません。例:PCB だけで 10 枚 USD295 + 税がかかります。FPGA/CPLD は中国から購入しており、安価な価格を提示するが届かない販売業者が多い中、Chipsgate と Longsheng-electronic が最も信頼できるようです(ただし再生品を新品として販売されたことがあります)。Mouser や Farnell のような信頼できる企業から購入することもできますが、FPGA だけで GBP200 を超えることになります。

クレジット

サードパーティのデザインを使用または参考にした場合は、オリジナル作者の著作権表示を含めています。私の知識と調査の範囲では、すべてのサードパーティソフトウェアはオープンソースで自由に使用可能です。ライセンス上の制限があるコンポーネントが見つかった場合は、このリポジトリから削除され、適切なリンク/設定が提供されます。

ライセンス

このデザイン(ハードウェアおよびソフトウェア)は GNU Public Licence v3 の下でライセンスされています。

GNU パブリックライセンス v3

GPL v3 としてマークされたこのプロジェクト内のソースおよびバイナリファイルはフリーソフトウェアです。Free Software Foundation が公開する GNU 一般公衆利用許諾書バージョン 3、またはそれ以降のバージョンの条件の下で再配布および/または変更することができます。

ソースファイルは有用であることを期待して配布されていますが、いかなる保証もありません。商品性や特定目的への適合性の黙示的な保証も含みません。詳細は GNU 一般公衆利用許諾書を参照してください。

このプログラムとともに GNU 一般公衆利用許諾書のコピーを受け取っているはずです。受け取っていない場合は http://www.gnu.org/licenses/ を参照してください。