tranZPUter SW-700

前書き

tranZPUter SW-700は、もともとSharp MZ-80A向けに開発されたtranZPUter、tranZPUter SW、およびVideo Module v2.0プロジェクトを統合・進化させたものです。

このプロジェクトは、Sharp MZ-80Aで現在提供されているのと同様の機能を、Sharp MZ-700にも提供することを目的としています。

Sharp MZ-700はよりコンパクトな設計であり、CPUとビデオをアップグレードするための新しいソリューションが必要でした。既存のビデオをハードウェア的な改造なしにアップグレードすることは不可能であり、内部スペースも限られていたため、より大きな課題となりました。最終的に、tranZPUter SWとVideo Moduleの設計を組み合わせた統合ボードに落ち着きました。部品点数を減らし、新しい拡張ビデオとオリジナルビデオが共存できるようにしています。このソリューションにより、マシンをオリジナルのまま動作させることも、必要に応じて選択可能な拡張機能を使用することもできます。MZ-700の強化にとどまらず、様々な可能性を秘めたより完成度の高いソリューションです。たとえば、オンボードのK64FプロセッサをホストとしてLinuxをターミナル経由で実行したり、CPLD/FPGAを再プログラムしてソフトCPUをインスタンス化し、あらゆるプロセッサ向けの開発ステーションを作成したりすることも可能であり、マイクロプロセッサやFPGAを学ぶ学生にとっても非常に有益でしょう。

設計は現在も開発中であり、新しい情報が入り次第、これらのページは更新されます。読者の方はtranZPUter SW-700の進化を理解するために、tranZPUter、tranZPUter SW、Video Moduleに関する各セクションも合わせてお読みください。

すべてはC/C++で記述される予定です(FLW — Famous Last Words(「最後の大見得」):オリジナルのtranZPUter SWではK64FがコンパイルされたCでは処理能力が不足していたため、割り込みサービスルーチンをARM Thumbアセンブラで記述せざるを得ませんでした)。

概要

Sharp MZ-700はZ80 CPUをベースとし、3.54MHzで動作しています。ビンテージ(とはいえZ80は現在も新しい産業用設計に33MHz以上で広く使用されています)であり、現代のコンピュータ(あるいはRaspberry Pi)と比べると処理能力は低いです。歴史的な価値があるほか、ソフトウェア資産を持ちファン層も今なお存在します。Sharp MZ-700向けにはソフトウェアの活用を延命するための多数のエミュレータが開発されていますが、オリジナルのハードウェアを使うことには特別な意義があります。これはマシンをオリジナルのまま保ちつつ、BBC MicroのPiCoProのような複数の異なるCPUをソフトウェアで実現する追加処理能力、ストレージ、そしてアップグレードを提供するための代替手段です。これはすべて、オリジナルのCPUをトライステートにし、K64F/CPLD/FPGAがバスと下層のオリジナルマザーボードペリフェラルを必要に応じて制御するバスマスタリングによって実現されます。

このアップグレードはZ80のハードウェア機能も拡張し、64K版CP/M v2.2(ポート作業が完了すれば最大512K版CP/M v3まで)を実現するための追加RAMを提供するとともに、Sharp MZ-700マザーボードペリフェラルへのアクセス時にはオリジナルの速度を維持しながらプロセッサの動作速度を向上させます。

この設計は現在も進化中ですが、成熟して安定した状態になっており、tranZPUter、tranZPUter SW、Video Moduleプロジェクトと連携して動作しています。前述のプロジェクトに更新があれば、あるいはその逆の場合も、この設計にバックポートされます。tranZPUter SW向けに記述されたC/C++制御ソフトウェアは共通であり、ZPU上のtranZPUterでも動作するように設計されています。

tranZPUter SW-700

tranZPUterという名称は「TRANsformable ZPU compuTER(変容可能なZPUコンピュータ)」に由来します。オリジナルのtranZPUterに当初想定されていたベースCPUはZPU Evoであり、ZPU EvoがオリジナルのZ80をトライステートにし、MZ-80AのメモリとペリフェラルをZPUデバイスとして扱いながらMenuサービス、SDサービス、Video Overlayサービスを提供することが求められていました。

tranZPUter SW-700はtranZPUter / tranZPUter SWの設計を受け継ぎ、ホストのビデオをアップグレードするVideo Moduleの機能も統合しています。また下層のZ80ハードウェアをアップグレードし、より高いパフォーマンスと増大したメモリを実現します。ZPU EvoはFPGA上のVHDLに基づくハードウェアソリューションであるのに対し、tranZPUter SW-700はより要件をソフトウェアで解決するアプローチをとっており、ZPU Evoの代わりにFreescale K64F ARM Cortex-M4を内蔵しています。このプロジェクトは設計を識別するために、MZ-700向けのSoftWareを意味する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を使用することの利点は、より高いパフォーマンスと代替ソフトウェアへのアクセスです。

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

ハードウェア

この設計の基本は、Z80バスマスタリング、すなわちZ80を回路から切り離して残りのコンピュータハードウェアを必要に応じて制御する能力にあります。バスマスタリングは従来、DMAのようなデバイスがI/Oデバイスからメモリへまたはメモリからメモリへ(たとえばビデオ/グラフィクスなどの用途で)高速にデータを転送するために使用されていました。Z80バスの制御を取得したデバイスは、同じ動作をプログラムで実行するZ80よりもはるかに高速にデータを転送できるため、この手法が有益です。

バスマスタリングは、メインメモリとSDカード間、またはI/OプロセッサとメニューをVディスプレイバッファに表示するためのビデオバッファ間でデータを転送するためのZ80バス制御に使用されます。また、ソフトプロセッサがハード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コードのデバッグに最適です。

オプション機能として、PJRCブートストラップMCUのインストールがあり、USBケーブルを使ってK64Fファームウェアを更新できます。このMCUを使用しない場合は、JTAGインターフェースとFreescale FRDM-K64F開発ボード上にあるようなOpenSDA互換インターフェースを使って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を使用することが意図的に選択されました。

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

v1.2 JTAGプログラミングおよびオシレータ

Sheet 3


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

FPGAは内部ロジックマトリクスを設定するビットストリームを必要とし、これにより目的のハードウェア機能が提供されます。JTAGインターフェース経由でリアルタイムに実行することができますが、電源投入時の問題は解決されません。これが、Cyclone III FPGAのブートストラップピンに接続されたEPCS16(16Mbitフラッシュ)が必要な理由です。EPCS16はAlteraが提供するIP(知的財産)を使用してCyclone III経由でプログラムされ、JTAGプログラミングをEPCS16プログラミングに変換します。プログラム後、電源投入または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、そしてこの設計ではCPLDとインターフェースするため3.3Vの選択可能なI/O電圧が必要です。

これらの電圧を生成するために、各レール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ハードウェアよりも高い色深度を出すために1色あたり4ビット(3:0)が出力されており、ビデオRAM属性ビットから直接駆動するか、カラーパレットルックアップテーブルを介して駆動できます。この設計ではオリジナルのモジュレータとの互換性を維持する必要があるため、1色あたり5ビット目が追加されました。これにより、デジタルRGBモニタおよびモジュレータ内部のコンポジット/TV回路が論理1として2V以上の電圧で駆動されます(アナログRGBの0〜0.75Vp-pの要件ではなく)。デジタルRGBモニタまたはMZ-700のコンポジット/TV出力を駆動する場合、5ビット目はすべての他のビットとともにアクティブになり、デジタル1として2.0V以上が確保されます。アナログRGBモニタを駆動する場合は5ビット目をアクティブにできません(入力が過飽和になるため)が、5ビット目をhi-Zまたは0レベルに設定すると、1色あたりさらに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ビットの電流シンクとして機能し、モニタが認識する電圧が下がります。これにより1色あたり32のユニークな電圧レベルが得られます。5ビット目をhi-Z(ハイインピーダンス)に設定すると、ビット3:0からの電圧出力への変化はほぼありません。

v1.2 プリント基板


MZ-700内に収めるためのプリント基板の要件は、マザーボード部品への干渉、ケースの障害物、発熱などを考慮した設置場所の正確な把握が必要でした。また、ボードはZ80ソケットに収まりつつ、モジュレータコネクタにも接続できなければならず、これらの両方がボードを電気的・機械的に安定させるアンカーポイントを提供します。

この設計では3つの高密度TQFPパッケージを使用しており、ルーティングなどの複雑さが増しています。0.5mmピッチの大きな面積にランドを出力するため十分なスペースが必要であり、電力分配とデカップリングも考慮する必要があります。ボードは2層に意図的に抑えて最良の製造コストを実現しています(ステンシル込みで基板10枚あたり通常60米ドル)。多層化するとコストが倍以上になる一方で、サイズの削減効果はわずかです。

以下のボードは、Sharp MZ-700用に完全に組み立て・テストされたプリント基板であり、実機に取り付けた状態の画像も掲載しています。

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の作成も可能となり、次の反復となるオリジナルのZPUベースtranZPUterへの足がかりになります(それはFPGAのみをベースとし、Z80はなく、FPGA内のソフトCPUとしてインスタンス化されたZ80を持つZ80拡張ソケットのみになります)。

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

Sheet 1

バージョン1.3は、FPGAとCPLD/FPGA間の追加相互接続を除き、すべての点でv1.2と同一です。v1.2はTQFPパッケージのCyclone III(25K LE)を使用していましたが、v1.3はCyclone IV(75K LE)を使用し、484ピンBGAパッケージになっています。作業の大部分はデカップリング、ピンの割り当て、プリント基板の製造に集中していました。

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

Sheet 2


K64F回路図はv1.2と基本的に同じですが、相互接続の見直しが行われています。不要になったものを削除し、メモリおよびFPGAリソースの完全な24ビット直接アドレッシングを可能にするために追加されています。

v1.3 JTAGプログラミングおよびオシレータ

Sheet 3


バージョン1.3ではFPGAが変更されたため、クロックが異なるクロック入力に割り当てられます。また、デバイスが大型化したため、より大きなブートデバイス(EPCS64、64MbitシリアルフラッシュRAM)が必要になります。v1.2でCONFIGスイッチが冗長であることが判明したため、v1.3では削除されています。JTAG経由またはPJRC MCU経由のプログラミングにより、FPGAのconfigモードが自動的に起動されます。

v1.3 電源

Sheet 4


より大型のFPGAデバイスを使用するとデカップリングへの要求が高まり、Altera PDNツールによれば34個以上のデカップリングコンデンサが必要と判断されました。プリント基板のレイアウトとルーティングが非常に興味深いものになりました!

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

Sheet 5


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

v1.3 プリント基板


バージョン1.3のプリント基板はv1.2の改版であり、144ピンTQFPを484ピンBGAに置き換えています。両者はサイズは同じですが、一部の部品の配置とルーティングが異なります。プリント基板は引き続き2層設計ですが、BGAの採用によりビア/ランドジオメトリが小型化され、マスクまたはフィルドビアが使用されています。これによりプリント基板の製造コストがv1.2設計の数倍に増加します。プリント基板にはルーティングエラーがあり、製造コストを考慮して修正が必要でした。BGAパッドの再ルーティングとドリル加工という複雑な作業でしたが、二度と忘れることのない経験です。「二度測って一度切れ」という古い格言が思い起こされますが、二度は測ったものの最終確認を怠りました。特にコンピュータのクラッシュの後(そこでエラーが発生したと思われます)。私の責任です!

PCB TopSide

PCB UnderSide

PCB Installed

設計詳細

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

K64F Z80 ホストAPI

APIは、Z80の64Kメモリ空間内の共通RAMブロックに基づいており、このブロックを通じてプロセッサ間通信が行われます。K64FではC言語の構造体として宣言され、Z80側ではアセンブラのメモリ変数参照として実装されています。
// コマンドサービス処理と結果のためのCPU間通信メモリを格納する構造体。
// 通常、Z80はメモリ空間内の構造体にコマンドを書き込んでI/Oリクエストをアサートし、
// K64Fはリクエストを検出してZ80メモリ空間から構造体の下位部分を読み取り、
// コマンドを判定した後、残りの部分を読み取るか書き込みます。この構造体は
// Z80とK64Fの両ドメインに存在し、必要に応じてデータが同期されます。
//
typedef struct __attribute__((__packed__)) {
    uint8_t                          cmd;                                // コマンドリクエスト。
    uint8_t                          result;                             // 結果コード。0xFE - Z80がセット、コマンド有効、0xFE - K64Fがセット、コマンドACKおよび処理中。0x00-0xF0 = コマンド完了と処理結果。
    union {
        uint8_t                      dirSector;                          // 仮想ディレクトリのセクタ番号。
        uint8_t                      fileSector;                         // 開いているファイル内で読み書きするセクタ。
        uint8_t                      vDriveNo;                           // 仮想または物理SDカードのドライブ番号。
    };
    union {
        struct {
            uint16_t                 trackNo;                            // トラックとセクタを持つ仮想ドライブのトラック番号
            uint16_t                 sectorNo;                           // トラックとセクタを持つ仮想ドライブのセクタ番号。注:LBAアクセスの場合、これは32ビットでfileNo/fileTypeを上書き(RAWなSDアクセス時には未使用)。
        };
        uint32_t                     sectorLBA;                          // LBAアクセスの場合、32ビットでRAW SDアクセスに使用。
    };
    uint8_t                          fileNo;                             // 最後のディレクトリリスト内のファイルのファイル番号(開く/更新用)。
    uint8_t                          fileType;                           // 処理中のファイルタイプ。
    union {
        uint16_t                     loadAddr;                           // 動的に設定が必要なROM/ファイルイメージのロードアドレス。
        uint16_t                     saveAddr;                           // 動的に設定が必要なROM/ファイルイメージのセーブアドレス。
        uint16_t                     cpuFreq;                            // CPU周波数(KHz単位)- 代替CPUクロック周波数の設定に使用。
    };
    union {
        uint16_t                     loadSize;                           // ロードするROM/ファイルのサイズ。
        uint16_t                     saveSize;                           // セーブするROM/ファイルのサイズ。
    };
    uint8_t                          directory[TZSVC_DIRNAME_SIZE];      // ファイルを検索するディレクトリ。ディレクトリが指定されない場合はMZFをデフォルトとする。
    uint8_t                          filename[TZSVC_FILENAME_SIZE];      // 開くまたは作成するファイル。
    uint8_t                          wildcard[TZSVC_WILDCARD_SIZE];      // ディレクトリ検索に適用する基本的なワイルドカードパターンマッチフィルタ。
    uint8_t                          sector[TZSVC_SECTOR_SIZE];          // ディスク読み書き全般に使用するセクタバッファ。
} 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_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で指定されたHz値に変更する。Z80は最も近いタイマー分解能でこの周波数でクロックされる。
TZSVC_CMD_CPU_SETZ80 0x50 外部Z80ハードCPUに切り替える。
TZSVC_CMD_CPU_SETT80 0x51 内部T80ソフトCPUに切り替える。
TZSVC_CMD_CPU_SETZPUEVO 0x52 内部ZPU Evolutionプロセッサに切り替える。
TZSVC_CMD_SD_DISKINIT 0x60 下層SDカードへの初期化とRAWアクセスを提供する。
TZSVC_CMD_SD_READSECTOR 0x61 下層SDカードへのRAW読み取りアクセスを提供する。
TZSVC_CMD_SD_WRITESECTOR 0x62 下層SDカードへのRAW書き込みアクセスを提供する。
TZSVC_CMD_EXIT 0x7F TZFSを終了してマシンをオリジナルモードで再起動する。

API結果一覧

コマンド 結果番号 説明
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は監視およびサービスの役割を担っています。Z80はK64Fが存在しなくても単独で機能することができ、ホストマシンを完全にオリジナルのまま保ちます。さらにtranZPUterボードは、Z80が必要に応じて利用できる512Kスタティックなどのいくつかの新しいアップグレードも提供します。

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

たとえばZ80がBIOSロードを要求する場合、I/Oアウトリクエストを生成してK64Fを割り込みます。K64FはZ80をトライステートバスマスタモードに移行させ、SDカードからBIOSを読み取り、Z80ラインを操作してBIOSデータをZ80 RAMに書き込みます。

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

Z80信号のK64F GPIOポート/ピンへのピン割り当ては、K64FがGPIOピンを内部レジスタに線形に割り当てていないため(GPIOピンは5つの32ビットレジスタに分散されている)、やや不規則になっています。この非線形な割り当てにより、リアルタイムでの16ビットアドレスや8ビットデータ値の組み立てとデコードにオーバーヘッドが発生します。

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

以下のテーブルは、Z80信号と対応するK64Fピンの関係を示しています。信号はK64F内部の5つの32ビットレジスタに分散されています。
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版から生まれたもので、デコーダはFlash RAMをベースとしていました。MZ-700、CP/Mなど当時想定されたすべてのメモリモデルが考案されました。これらのモードはVideo Moduleなどの新機能に対応するためCPLD内で後継設計において拡充され、今後もさらに強化されていくでしょう。

定義済みのモードを以下のテーブルに示します。将来の拡張用にいくつかのスロットが空いています。
モード ターゲット 範囲 ブロック 機能 DRAM更新 説明
0 オリジナル 0000:0FFF Main MROM Yes デフォルト。通常のホスト(Sharp MZ80A/MZ-700)動作モード。tranZPUter制御I/Oブロックを除くすべてのメモリおよびIOがマザーボード上にある。
    1000:CFFF Main D-RAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF Main ユーザーROM    
    F000:FFFF Main FDC ROM    
1 オリジナル+UROM 0000:0FFF Main MROM Yes モード0と同様だが、ユーザー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 ユーザーROM    
    F000:FFFF Main FDC ROM    
2 TZFS 0000:0FFF RAM 0 MROM No TZFSまたはtranZPUter RAMを必要とするその他ソフトウェアのブートモード。ユーザーROMはMonitorにROMとして見え、通常の起動手順の一部として0xE800のエントリポイントを呼び出す。F3FEとF7FEにFDC用の小さな穴が存在しマザーボード上に必要。
    1000:CFFF RAM 0 メインRAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザーROM    
    F000:FFFF RAM 0 FDC ROM    
3 TZFS 0000:0FFF RAM 0 MROM No TZFSのページモード。F000:FFFFはブロック1にあり、TZFSのページバンク2。
    1000:CFFF RAM 0 メインRAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザー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 メインRAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザー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 メインRAM    
    D000:D7FF RAM 0 VRAM    
    D800:DFFF RAM 0 ARAM    
    E000:E7FF RAM 0 MM I/O    
    E800:EFFF RAM 0 ユーザーROM    
    F000:FFFF RAM 3 FDC ROM    
6 CP/M 0000:FFFF RAM 4 メインRAM No CP/M。すべてのメモリがtranZPUterボード上にある。F3C0:F3FFおよびF7C0:F7FFはマザーボード上の特殊ケース。
7 CP/M 0000:0100 RAM 4 CP/Mベクタ No CP/MメインCBIOSエリア。CBIOSに48K+2Kが利用可能。F000:FFFFはバンク4に残り、モード6とのゲートウェイ。
    0100:CFFF RAM 5 メインRAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF RAM 5 ユーザーROM    
    F000:FFFF RAM 4 FDC ROM    
8 オリジナル+エミュ 0000:0FFF Main MROM Yes オリジナルモードだが、メインRAMはtranZPUterバンク0。起動時バンク切り替えを行うMZ-700プログラムのブートストラップに使用。
    1000:CFFF RAM 0 メインRAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF Main ユーザーROM    
    F000:FFFF Main FDC ROM    
10 MZ-700 0000:0FFF RAM 6 メインRAM No MZ-700モード(OUT $E0)— モニターRAMがメインRAMに置換。
    1000:CFFF RAM 0 メインRAM    
    D000:D7FF Main VRAM    
    D800:DFFF Main ARAM    
    E000:E7FF Main MM I/O    
    E800:EFFF Main ユーザー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 メインRAM    
    D000:D7FF RAM 6 VRAM    
    D800:DFFF RAM 6 ARAM    
    E000:E7FF RAM 6 MM I/O    
    E800:EFFF RAM 6 ユーザーROM    
    F000:FFFF RAM 6 FDC ROM    
12 MZ-700 0000:0FFF RAM 6 メインRAM No MZ-700モード(OUT $E1 + $E2)— モニターRAMがRAMに、I/OおよびビデオブロックがメインRAMに置換。
    1000:CFFF RAM 0 メインRAM    
    D000:D7FF RAM 6 VRAM    
    D800:DFFF RAM 6 ARAM    
    E000:E7FF RAM 6 MM I/O    
    E800:EFFF RAM 6 ユーザー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 メインRAM    
    D000:FFFF n/a 未定義    
14 MZ-700 0000:0FFF RAM 6 メインRAM No MZ-700モード(OUT $E6)— モニターRAMがRAMに置換、上位メモリがロックアウト。
    1000:CFFF RAM 0 メインRAM    
    D000:FFFF n/a 未定義    
15 MZ-800/MZ-700         以下のテーブルを参照。メモリモードはMZ-800に準じる。
21 K64Fアクセス 000000:FFFFFF n/a FPGAリソース No K64Fから完全な24ビットZ80アドレスでFPGAメモリにアクセスする。
22 FPGAアクセス 0000:FFFF n/a ホストリソース Yes ホストマザーボードの64Kアドレス空間のみにアクセスする。
23 K64Fアクセス 000000:FFFFFF RAM メインRAM No K64Fが完全な512K RAMをアドレス指定してtranZPUterボード上のすべてのメモリとIOにアクセスする。
24 K64Fアクセス 0000:FFFF RAM 0 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック0。このモード使用時はtranZPUterライブラリがDRAMを更新。
25 K64Fアクセス 0000:FFFF RAM 1 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック1。
26 K64Fアクセス 0000:FFFF RAM 2 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック2。
27 K64Fアクセス 0000:FFFF RAM 3 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック3。
28 K64Fアクセス 0000:FFFF RAM 4 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック4。
29 K64Fアクセス 0000:FFFF RAM 5 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック5。
30 K64Fアクセス 0000:FFFF RAM 6 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック6。
31 K64Fアクセス 0000:FFFF RAM 7 メインRAM Yes/No すべてのメモリとIOがtranZPUterボード上、64Kブロック7。
凡例:
MROM = モニターROM、オリジナルのブートファームウェア(例:SA-1510)
D-RAM = マザーボード上のダイナミックRAM。
VRAM = マザーボード上のビデオRAM。
ARAM = マザーボード上のカラー属性RAM。
MM I/O = マザーボード上のメモリマップドI/Oコントローラ。
RAM 0 .. 7 = 512Kスタティックチップ内の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         メモリマップドI/O             上位MONITOR ROM
OUT 0xE4 MONITOR   DRAM   メモリマップドI/O MONITOR CGROM DRAM VRAM   DRAM 上位MONITOR ROM
OUT 0xE5         禁止             禁止
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周波数を実現するため、ホスト周波数を一方の入力とし、K64Fからの矩形波発生器を第二の入力とする正エッジトリガ型の周波数切り替え機構が実装されています。切り替え機構はバス制御ロジックに結びついており、ホストへのアクセスがあるたびにCPUの周波数がホストの周波数に変更されて信頼性の高い動作が継続されます。起動時にはZ80は常にホストクロックでクロックされ、マシンのオリジナル仕様が満たされます。

K64Fが存在する場合は第二の周波数を選択できます。K64Fはオンボードタイマーを使ってプログラマブルな矩形波出力を生成する能力があります。K64Fはこの第二クロックソースの周波数を設定し、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周波数を第二ソース(K64Fまたは外部オシレータが生成する周波数)に切り替える。
0x64 W Z80 CPU周波数をデフォルトのホストソースに切り替える。RESETでデフォルト。
0x66 R ビット[0] — 選択クロック。0 = ホストクロック、1 = 第二クロックソース(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 = 有効。
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コードが使用する。

ソフトプロセッサ

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

FPGAやASICの世界では、「ソフト」という言葉はしばしば文脈を外れて使われます。「ソフト」プロセッサはソフトウェアエミュレーションではなく、FPGAにインスタンス化したりASICにマスクしたりできるHDLで記述された物理ハードウェアデバイスです。「ソフト」はFPGAにおいてより関連性が高く、新しい相互接続マップをいつでもアップロードして実際のハードウェアデバイスを変更できます。FPGAはJTAGプログラミングツールまたはシリアルFlash設定デバイスなどサポートするプロトコルで相互接続ビットマップをロードします。デバイスがインスタンス化されて相互接続がロードされると、他のハードウェアと同様に動作します。したがってFPGA上の「ソフト」プロセッサは実行中、他の「ハード」プロセッサと同一です。

最初に、「ソフト」CPUがFPGA内に存在しながら下層のSharp MZ-700ハードウェアを制御するフレームワークを開発するため、T80プロセッサの組み込みを選択しました。これは由緒あるZilog Z80の再設計版であり、ほぼサイクル精度を達成して文書化・非文書化の命令をすべて実装し、外部使用のための正しいハードウェア信号を出力します。この設計はCPLDの変更(CPLDが双方向ゲートウェイになる必要があった)と、FPGA内でのT80プロセッサとサポートロジックのインスタンス化が必要でした。最終結果はtranZPUterカード上の「ハード」Z80と同一の、Sharp MZ-700のFPGA内で動作するプロセッサとなりました。

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

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

追加された第二のプロセッサはZPU Evolutionです。これはZylin ASのØyvind Harboeが組み込みシステムの監視モードで実行するための最小ロジックサイズCPUとして開発した32ビットスタックベースプロセッサです。ZPU FlexやZPUINOなどのいくつかの拡張版がありますが、どれも私がSharp MZシリーズエミュレータへの組み込みに求めるものを提供していなかったため、速度と拡張性を改良してZPU Evolutionを再設計しました。

ZPU Evolutionは組み込みを目的として設計されていたため、zOSがこの機能を念頭に置いて書かれました。デバイス内でタスクを実行してその機能を強化し、シリアル接続越しのインタラクティブセッションを提供するOSです。tranZPUter SWプロジェクトが生まれた際にzOSはK64Fに移植され、tranZPUter SWおよびSharp MZホストの内部に接続できることで設計とデバッグに大きく貢献しています。

ZPU EvoをtranZPUter SW-700の「ソフト」プロセッサとして追加するにはzOSの進化が必要でした。シリアル接続がなくなり、キーボード、画面などを直接制御する必要があります。これによりSharpMZモジュールが追加され、Sharp MZ-700のキーボードと画面を駆動する基本的なハードウェア抽象化レイヤー、ANSIターミナルエミュレータを含む基本的なユーザーI/O機能を提供します。Sharp MZ-700モニタからZPUを選択すると、zOSが起動しMS-DOSのようなインタラクティブな環境が提示されます。tbasic、mbasic、kilo(VT100ベースの画面エディタ)などの基本アプリケーションはzOSのappsセクションで見つけることができます。

ZPUとzOSは研究開発のためのものであり、エンドユーザー向けではありません。ZPUアーキテクチャの学習、プロセッサやOSの設計に役立つため、電子工学やコンピュータを学ぶ学生にとって非常に有益でしょう。

現在、FPGAにはMMU付きNIOSIIプロセッサをインスタンス化することを検討しています。FPGAはこのプロセッサとサポート回路を実装するリソースを持っており、最終的にはSharp MZ-700でLinuxが動作することになります。完成してこのページが更新されるまでは作業中として考えてください。

CPU設定レジスタ

CPU設定レジスタ(0x6C — 10進数108)
ビット 方向 説明
5:0 R/W このレジスタはFPGAをソフト/ハードCPUを有効にするよう設定し、CPLDはFPGA側でのCPU動作を許可するよう再設定される。一度に選択できるプロセッサは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。アプリケーションはこのRAM領域(0x100000始まり)にロードされて実行される。
D00000:EFFFFF   Z80バスステートマシン。アクセスされるアドレスによってトランザクションのタイプが決まる。
  D00000:D7FFFF tranZPUterボード上の512Kスタティック RAM。すべての読み取りは32ビット、書き込みはワード境界で8、16または32ビット幅。
  D80000:DBFFFF ホストマザーボードの64Kアドレス空間に1バイトずつアクセス。ZPUアドレス空間の4バイト = Z80アドレス空間の1バイト。
  DC0000:DFFFFF ホストマザーボードまたは下層CPLD/FPGA上の64K I/O空間。すべての読み取りは8ビット、書き込みはワード境界で8、16または32ビット幅。
  E00000:E0FFFF ホストマザーボードの64Kアドレス空間に4バイトずつアクセス。32ビット読み取りで連続する4バイトを返す。
  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 — 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〜n(ハードウェアビルド依存)。
  F00C40:F00C43 有効レジスタ。
  F00C44:F00C47 インデックスレジスタ。
  F00C48:F00C4b カウンタレジスタ。
  F00F00:F00FFF System on Chip設定。
  F00F00:F00F03 SOCCFG_ZPU_ID — インスタンス化されたZPUのID
  F00F04:F00F07 SOCCFG_SYSFREQ — システムクロック周波数(MHz×10)
  F00F08:F00F0B SOCCFG_MEMFREQ — SysbusのSDRAMクロック周波数(MHz×10)
  F00F0C:F00F0F SOCCFG_WBMEMFREQ — WishboneのSDRAMクロック周波数(MHz×10)
  F00F00:F00F03 SOCCFG_DEVIMPL — SOCに実装されたデバイスのビットマップ。
  F00F04:F00F07 SOCCFG_BRAMADDR — ブロックRAMのアドレス。
  F00F08:F00F0B SOCCFG_BRAMSIZE — ブロックRAMのサイズ。
  F00F0C:F00F0F SOCCFG_RAMADDR — RAMのアドレス。
  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ボードではAltera Cyclone III FPGA(76KB内部B(lock)RAMおよび25K ロジックエレメント)を基盤としています。更新されたv1.3ボードではAltera Cyclone IV E75/E115(360K/480Kおよび75K/115K ロジックエレメント)を基盤としています。

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色グラフィックスフレームバッファが追加されています。このフレームバッファは3つの16K RAMブロック(色ごとに1ブロック)で構成され、解像度640x200で出力ディスプレイバッファとビット単位で一致します。ディスプレイが40x25文字で動作している場合は解像度320x200、80x25の場合は640x200となります。

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

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

ディスプレイを高速化するために、カラー書き込みレジスタがあります(Sharp MZ-2500で利用可能なものと類似)。グラフィックスRAMへの書き込みで3つのバンクすべてを同時に更新でき、即時カラー書き込みが可能になります。

プログラマブルレジスタ

映像機能を利用するために、すべての機能にアクセスできる一連のレジスタが設計されています。

機能は次のようにグループ化されています。

  • コントロール — 映像機能モードの設定、カラム幅の設定、カラー/モノクロ機能の設定。
  • グラフィックス — グラフィックス機能の設定。
  • GPU — 映像処理を高速化するために内蔵グラフィックスプロセッサにタスクをオフロード。
  • パレット — 表示パレットの設定と構成。

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

コントロールレジスタ (0xF8 - 248 十進)

映像モードレジスタです。Video Module が動作するハードウェアモデルと、出力表示のカラム幅およびカラー機能を指定します。

ビット 方向 説明
2:0 R/W Video Module のハードウェアモデルを設定。
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。
グラフィックスモードレジスタ (0xF9 - 249 十進)

グラフィックスモードコントロールレジスタです。出力する映像の種類、ブレンド方法、読み書き可能なグラフィックス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)。キャラクタ表示とグラフィックス表示をブレンドする演算子。
カラーライタレジスタ (0xFA - 250 十進 〜 0xFC - 252 十進)
カラーライタレジスタはビットマップで、間接書き込み(つまり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 0xFAH 間接書き込み時に赤に設定。
1 R/W 6 0xFAH  
2 R/W 5 0xFAH  
3 R/W 4 0xFAH  
4 R/W 3 0xFAH  
5 R/W 2 0xFAH  
6 R/W 1 0xFAH  
7 R/W 0 0xFAH 間接書き込み時に赤に設定。
0 R/W 7 0xFBH 間接書き込み時に緑に設定。
1 R/W 6 0xFBH  
2 R/W 5 0xFBH  
3 R/W 4 0xFBH  
4 R/W 3 0xFBH  
5 R/W 2 0xFBH  
6 R/W 1 0xFBH  
7 R/W 0 0xFBH 間接書き込み時に緑に設定。
0 R/W 7 0xFCH 間接書き込み時に青に設定。
1 R/W 6 0xFCH  
2 R/W 5 0xFCH  
3 R/W 4 0xFCH  
4 R/W 3 0xFCH  
5 R/W 2 0xFCH  
6 R/W 1 0xFCH  
7 R/W 0 0xFCH 間接書き込み時に青に設定。
メモリページレジスタ (0xFD - 253 十進)

このレジスタはビデオメモリをZ80アドレス空間に有効化する役割を担います。3つのカラー各16KB GRAM(グラフィックスモードレジスタで選択)のうち1つを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 ページイン。
Video Module ステータスレジスタ (0xFD - 253 十進)

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

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

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

コマンド パラメータ 説明
0x00 n/a 操作なし。GPUがビジーでない場合のアイドル状態コマンドで、発行しても何も実行されません。
0x01 n/a 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 n/a 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 n/a GPUをリセット。実行中の操作をキャンセルし、直ちにアイドル状態に戻ります。
GPUステータスレジスタ (0xF7 - 247 十進)

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

ビット 方向 機能 説明
0 R BUSY GPUのビジー状態を示すフラグ。1 = ビジー、0 = アイドル。ビジーの場合、GPUがアイドルに戻るまで次のコマンドは処理されません。ただし RESETコマンドは即座に実行されます。
VGAボーダー領域レジスタ (0xF3 - 243 十進)

VGAモードでは、グラフィックスRAM/VRAMの拡大表示が表示領域全体を覆いきれず、通常は空白のままです。このレジスタにより属性を設定して、必要に応じて異なるカラーを適用できます。

ビット 方向 説明
2:0 R/W ボーダーカラーを設定。
2: = 赤
1: = 緑
0: = 青
パレット選択レジスタ (0xF5 - 245 十進)
このレジスタはアクティブなパレットを選択します。Video Module はカラー出力ごとに4ビット(tranZPUter SW-700 では5ビット)をサポートしますが、1ビット/カラーのRAMしかないため、パレットを使用して出力カラーを変更します。

パレットは256種類あり、0はシステムカラーのデフォルト、1〜255はFPGA HDLコンパイル時に固定されたパレットです。パレットは以下に説明するパレット設定レジスタで再プログラムできます。

tranZPUter SW-700 では、ビット4がビット3:0の指定カラーのサブカラーの濃淡を選択します。ハードウェアはオリジナルモード時にビット4でデジタル出力を駆動し、FPGAモードでは1に設定するとサブカラーセットを、0にすると標準RGB 3:0カラーを選択するよう設定できます。
パレット設定オフポインタレジスタ選択 (0xD3 - 211 十進)

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

パレット設定オンポインタレジスタ選択 (0xD4 - 212 十進)

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

パレット赤値設定レジスタ (0xD5 - 213 十進)

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

パレット緑値設定レジスタ (0xD6 - 214 十進)

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

パレット青値設定レジスタ (0xD6 - 214 十進)

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

ビデオモードパラメータレジスタ設定 (0xD0 - 208 十進)
このレジスタを使用して現在のビデオモードパラメータを変更できます。変更するパラメータ番号をこのレジスタに書き込み、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
モード 説明 H_DSP_START H_DSP_END H_DSP_WND_START H_DSP_WND_END V_DSP_START V_DSP_END V_DSP_WND_START V_DSP_WND_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 は 512x260 スキャン・320x200 表示領域のモノクロ 60Hz ディスプレイ。 0 320 0 320 0 200 0 200 511 259 40 320 + 43 320 + 43 + 45 200 + 19 200 + 19 + 4 0 0 0 0
1 MZ80K/C/1200/A の適合モノクロ 60Hz ディスプレイ、1024x260 スキャン・640x200 表示領域。 0 640 0 640 0 200 0 200 1023 259 80 640 + 106 640 + 106 + 90 200 + 19 200 + 19 + 4 0 0 0 0
2 MZ80K/C/1200/A の MZ700 スタイルカラー @ 60Hz、512x260 スキャン・320x200 表示領域。 0 320 0 320 0 200 0 200 511 259 40 320 + 43 320 + 43 + 45 200 + 19 200 + 19 + 4 0 0 0 0
3 MZ80K/C/1200/A の MZ700 スタイルカラー @ 60Hz、1024x260 スキャン・640x200 表示領域。 0 640 0 640 0 200 0 200 1023 259 80 640 + 106 640 + 106 + 90 200 + 19 200 + 19 + 4 0 0 0 0
4 モード0を640x480 @ 60Hz タイミングで40桁モノクロにアップスケール。 0 640 0 640 0 480 0 400 799 524 40 640 + 16 640 + 16 + 96 480 + 10 480 + 10 + 2 0 0 1 1
5 モード1を640x480 @ 60Hz タイミングで80桁モノクロにアップスケール。 0 640 0 640 0 480 0 400 799 524 80 640 + 16 640 + 16 + 96 480 + 10 480 + 10 + 2 0 0 0 1
6 モード2を640x480 @ 60Hz タイミングで40桁カラーにアップスケール。 0 640 0 640 0 480 0 400 799 524 40 640 + 16 640 + 16 + 96 480 + 10 480 + 10 + 2 0 0 1 1
7 モード3を640x480 @ 60Hz タイミングで80桁カラーにアップスケール。 0 640 0 640 0 480 0 400 799 524 80 640 + 16 640 + 16 + 96 480 + 10 480 + 10 + 2 0 0 0 1
8 モード0を1024x768 @ 60Hz タイミングで40桁モノクロにアップスケール。 0 1024 0 960 0 768 0 600 1343 805 40 1024 + 24 1024 + 24 + 136 768 + 3 768 + 3 + 6 0 0 2 2
9 モード1を1024x768 @ 60Hz タイミングで80桁モノクロにアップスケール。 0 1024 0 640 0 768 0 600 1343 805 80 1024 + 24 1024 + 24 + 136 768 + 3 768 + 3 + 6 0 0 0 2
10 モード2を1024x768 @ 60Hz タイミングで40桁カラーにアップスケール。 0 1024 0 960 0 768 0 600 1343 805 40 1024 + 24 1024 + 24 + 136 768 + 3 768 + 3 + 6 0 0 2 2
11 モード3を1024x768 @ 60Hz タイミングで80桁カラーにアップスケール。 0 1024 0 640 0 768 0 600 1343 805 80 1024 + 24 1024 + 24 + 136 768 + 3 768 + 3 + 6 0 0 0 2
12 モード0を800x600 @ 60Hz タイミングで40桁モノクロにアップスケール。 0 800 0 640 0 600 0 600 1055 627 40 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 1 2
13 モード1を800x600 @ 60Hz タイミングで80桁モノクロにアップスケール。 0 800 0 640 0 600 0 600 1055 627 80 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 0 2
14 モード2を800x600 @ 60Hz タイミングで40桁カラーにアップスケール。 0 800 0 640 0 600 0 600 1055 627 40 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 1 2
15 モード3を800x600 @ 60Hz タイミングで80桁カラーにアップスケール。 0 800 0 640 0 600 0 600 1055 627 80 800 + 40 800 + 40 + 128 600 + 1 600 + 1 + 4 1 1 0 2
凡例:
H_DSP_START = 水平表示領域開始。指定モードの物理表示領域。
H_DSP_END = 水平表示領域終了。
H_DSP_WND_START = 水平表示ウィンドウ開始。データが出力される実際の表示領域。
H_DSP_WND_END = 水平表示ウィンドウ終了。
V_DSP_START = 垂直表示領域開始。
V_DSP_END = 垂直表示領域終了。
V_DSP_WND_START = 垂直表示領域ウィンドウ開始。
V_DSP_WND_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 など。

ビデオモード下位パラメータバイトレジスタ設定 (0xD1 - 209 十進)

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

ビデオモード上位パラメータバイトレジスタ設定 (0xD2 - 210 十進)

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

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

Video Controller には、CPLDメモリマネージャをバイパスする24ビットアドレスを使用したダイレクトアクセスモードがあります。このモードは K64F I/Oプロセッサや FPGA 上にインスタンス化されたソフトプロセッサで使用できます。以下の表で、Y はアドレスオフセットを指し、ZPU 構成では 0xE00000 になります。

アドレス範囲 A23 - A16 A15 - A8 A7 - A0 MZ アドレス 説明
Y+0x000000 00000000       通常の Sharp MZ 動作。ダイレクトアクセス機能は無効。すべてのアクセスは Z80 バス/CPLD 経由。
Y+0x080000 00001000       メモリおよびI/Oポートをダイレクトアドレス可能なメモリ位置にマッピング。
          I/Oレジスタは I/O アドレスをミラーリングした下位256バイトにマッピング。
Y+0x0800D0   00000000 11010000 0xD0 更新するパラメータ番号を設定。
    00000000 11010001 0xD1 選択されたパラメータの下位バイトを更新。
    00000000 11010010 0xD2 選択されたパラメータの上位バイトを更新。
    00000000 11010011 0xD3 調整するパレットスロットのオフ位置を設定。
    00000000 11010100 0xD4 調整するパレットスロットのオン位置を設定。
    00000000 11010101 0xD5 PALETTE_PARAM_SEL アドレスに従い赤パレット値を設定。
    00000000 11010110 0xD6 PALETTE_PARAM_SEL アドレスに従い緑パレット値を設定。
Y+0x0800D7   00000000 11010111 0xD7 PALETTE_PARAM_SEL アドレスに従い青パレット値を設定。
Y+0x0800E0   00000000 11100000 0xE0 MZ80B PPI
    00000000 11100100 0xE4 MZ80B PIT
Y+0x0800E8   00000000 11101000 0xE8 MZ80B PIO
    00000000 11110000    
    00000000 11110001    
    00000000 11110010    
Y+0x0800F3   00000000 11110011 0xF3 VGA ボーダーカラーを設定。
    00000000 11110100 0xF4 MZ80B 映像入出力モードを設定。
    00000000 11110101 0xF5 パレットを設定。
    00000000 11110110 0xF6 パラメータを設定。
    00000000 11110111 0xF7 グラフィックスプロセッサユニットコマンドを設定。
    00000000 11111000 0xF6 パラメータを設定。
    00000000 11111001 0xF7 グラフィックスプロセッサユニットコマンドを設定。
    00000000 11111010 0xF8 ビデオモードを設定。
    00000000 11111011 0xF9 グラフィックスモードを設定。
    00000000 11111100 0xFA 赤ビットマスクを設定
    00000000 11111101 0xFB 緑ビットマスクを設定
    00000000 11111110 0xFC 青ビットマスクを設定
Y+0x0800FD   00000000 11111111 0xFD ブロック C000:FFFF のビデオメモリページを設定
          メモリレジスタはベース機と同様に E000 領域にマッピング。
Y+0x08E010   11100000 00010010 0xE010 キャラクタジェネレータRAMをプログラム。E010 - 書き込みサイクル(読み出しサイクル = メモリスワップリセット)。
    11100000 00010100 0xE014 通常表示選択。
    11100000 00010101 0xE015 反転表示選択。
    11100010 00000000 0xE200- スクロール表示レジスタ。E200〜E2FF
Y+0x08E2FF   11111111   0xE2FF  
Y+0x090000 00001001       映像/属性RAM。64K ウィンドウ。
Y+0x09D000   11010000 00000000 0xD000- 映像RAM
Y+0x09D7FF   11010111 11111111 0xD7FF  
Y+0x09D800   11011000 00000000 0xD800- 属性RAM
Y+0x09DFFF   11011111 11111111 0xDFFF  
Y+0x0A0000 00001010       キャラクタジェネレータRAM
Y+0x0A0000   00000000 00000000   CGROM
Y+0x0A0FFF   00001111 11111111    
Y+0x0A1000   00010000 00000000   CGRAM
Y+0x0A1FFF   00011111 11111111    
Y+0x0C0000 00001100       赤フレームバッファ。
    00000000 00000000   赤ピクセルアドレス指定フレームバッファ。下位8K に MZ-80B GRAM I メモリも含む
Y+0x0C3FFF   00111111 11111111    
Y+0x0D0000 00001101       青フレームバッファ。
    00000000 00000000   青ピクセルアドレス指定フレームバッファ。下位8K に MZ-80B GRAM II メモリも含む
Y+0x0D3FFF   00111111 11111111    
Y+0x0E0000 00001110       緑フレームバッファ。
    00000000 00000000   緑ピクセルアドレス指定フレームバッファ。
Y+0x0E3FFF   00111111 11111111    
           

互換モード

tranZPUter SW-700 は、Sharp MZ-80A ベースの tranZPUter SW + Video Module v2.0 の進化版です。Sharp MZ-80A では、Sharp MZ-700 のソフトウェアをできるだけ実機に近い形で動作させることが求められていました。これはCPLDを使ってハードウェアの違いをハードウェアレベルでマッピングすることで実現され、MZ-80A 上で動作する MZ-700 ソフトウェアが MZ-700 ハードウェアを見えるようになります。このハードウェアリマッピングを互換モードと呼びます。

tranZPUter SW-700 の互換モードも同様ですが、MZ-700 上で動作する Sharp MZ-80A ソフトウェア、および他の Sharp MZ モデルへの互換性を提供します。

以下のセクションでは現在の互換モードとリマッピングされるハードウェアについて説明します。

Sharp MZ-80A モード

tranZPUter の目的の一つは、ホストマシン上で他のモデルのソフトウェアをできる限り動作させることでした。オリジナルのホストは MZ-80A で、MZ-700/MZ-800/MZ-80B 向けのソフトウェアを動作させることが目標でした。MZ-80A が MZ-700 ソフトウェアを動作できるようにするロジックとソフトウェアが開発され、tranZPUter SW-700 の登場により、tranZPUter SW-700 ボードがハードウェアレベルで MZ-80A をエミュレートすることが自然な流れとなりました。

MZ-700 と MZ-80A の相違点:
Sharp MZ80A Sharp MZ-700
48K RAM、1000:CFFFH からの連続ブロック。0000:0FFFH のROMと C000:CFFFH のRAMをスワップするオプションあり。 64K RAM、1000:CFFFH からの連続ブロック。0000:0FFFH および D000:FFFFH はページング可能。
キーボード — テンキー付きビジネスレイアウト。ハードウェアは MZ-700 と同一だがキーを識別するストローブとデータラインが異なる。 キーボード — パーソナルレイアウト。
ディスプレイ — 40桁モノクロ。ベースハードウェアは MZ-700 と同一。 カラーディスプレイ — 前景色と背景色を提供する属性RAMを追加。代替キャラクタ用に大型キャラクタジェネレータROMを追加。
CPU周波数 — 2MHz CPU周波数 3.54MHz
tranZPUter SW-700 の設計では、個別のハードワイヤードロジックではなくCPLD(複雑論理デバイス)を使用しています。これにより、ロジック内でハードウェアレベルの互換性を追加する大きな余地が生まれます。CPLDを使用することでメモリ管理とキーボードリマッピングの両方がハードウェア内で行われます。K64F は MZ-80A BIOS を読み込んで正しい2MHz周波数を設定し、Z80 は CPLDレジスタへの書き込みでエミュレーションモードを有効化します。これによりマシンは MZ-80A と同様に動作し、キーボードは MZ-700 レイアウトから MZ-80A レイアウトにリアルタイムでリマッピングされます。

キーボードマッピング

MZ-700 のキーボードレイアウトを MZ-80A にコピーしてマッピングが行われています。

MZ-700 キー MZ-80A キー MZ-80A キー MZ-700 キー
GRAPH BREAK/CTRL GRPH ALPHA
CTRL INST/DEL CLR/HOME BREAK
無印キー カーソル左/右 カーソル上/下 下矢印/ポンド記号
INST/CLR テンキー7 テンキー8 カーソル上
DEL/HOME テンキー9 テンキー4 カーソル左
機能なし テンキー5 テンキー6 カーソル右
F1 キー テンキー1 テンキー2 カーソル下
F5 キー テンキー3 テンキー0 F2 キー
F3 キー テンキー00 テンキー. F4 キー
機能なし テンキー+ テンキー- 機能なし

その他のキーはマシン間で同一です。

Sharp MZ-80B モード

MZ-80A モードと同様に、tranZPUter の設計目標の一つは、元々 MZ-80A ホスト上で、さらに MZ-700 ホスト上でも Sharp MZ-80B ソフトウェアを動作させることです。

MZ-80B は MZ-80A/MZ-700 と多くの類似点がありますが、キーボードが異なり、I/O はメモリマップではなくI/Oマップです。64K メインメモリもバンク方式です。MZ-80A/MZ-80B/MZ-700 は共通のキャラクタベース映像ハードウェアとフロッピーディスクコントローラを共有しており、これがディスクベースソフトウェアの動作に役立ちます。

MZ-80A では CPLD のリソース不足により MZ-80B モードの実現に失敗しましたが、tranZPUter SW-700 の高度な機能を活用することで、FPGAリソースを利用した実現が可能になるはずです。

このモードは開発中であり、開発の進捗に応じて更新されます。

ハードウェア記述言語

tranZPUter SW-700 は、CPLD(複雑論理デバイス)と FPGA(フィールドプログラマブルゲートアレイ)を広範に活用しています。これらのデバイスはハードウェアロジック素子の配列で、回路を形成するために相互接続する必要があります。これらのデバイスを設定するにはビットマップが必要で、CPLD/FPGA にアップロードすると配列が所要の回路として構成されます。

ビットマップの作成方法はいくつかありますが、一般的にはソフトウェアのソースコードに似たハードウェア記述言語が使用されます。私は大学で学んだ ADA をベースにした VHDL を選びました。Verilog と System Verilog も使用しており、これらも優れた言語で、実際に私の Sharp MZ エミュレータでも使っていますが、このプロジェクトでは VHDL が HDL の第一選択です。

CPLD と FPGA はどちらも Sharp MZ エミュレータコードの再利用のしやすさを基準に選択しました。Sharp MZ エミュレータは Intel/Altera Cyclone V を使用していたため、同社製品を使い続けることが合理的でした。CPLD には 512 マクロセルの MAX 7000A デバイスを選択しました。これは最近のデバイスには見られない5V耐性を持ち、そうでなければ Sharp MZ-700 の信号を読み取るために追加の電圧変換回路が必要になります。FPGA は価格/パッケージ/機能の要件から選択しました。デバイスが(当初は)BGA でなく、既存の Sharp MZ エミュレータ映像ロジック HDL を組み込めること、つまり少なくとも 64K 内部ブロックRAMが必要でした。tranZPUter SW-700 の v1.2 には Cyclone III EP3C25 デバイスを採用しましたが、Sharp MZ エミュレータコードを使うには若干メモリが不足しているものの、多少の手直しで十分実用的です。改良版の v1.3 ボードでは Cyclone IV EP4CE75 を採用し、大幅に多くのリソースを持っています。

複雑論理デバイス — MAX 7000A

CPLDは、オリジナルの tranZPUter SW に搭載されていたディスクリートロジックとフラッシュRAMデコーダを置き換えます。Sharp MZ-700 と tranZPUter Z80 アップグレードロジックの Z80 信号に直接インターフェースし、以下を提供することを目的としています。

  • Z80 メモリマップデコード
  • Z80 バス制御
  • WAITステート生成
  • ハードウェアリマッピング
  • 電圧変換

CPLD 設定を構成するソースファイルは以下のとおりです。

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

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 の第二リリースであるバージョン1.3は、75K ロジックエレメント(115K LE も使用可能)の Cyclone IV デバイスを使用しており、バージョン1.2の映像機能だけでなく、T80(Z80 互換)や ZPU EVO(lution) などのソフトプロセッサも提供します。これにより、Sharp MZ シリーズマシンの内部に配置して異なるCPUと異なるオペレーティングシステムを提供するという当初の設計目標が達成されます。T80 の提供は性能向上または研究/実験用の命令カスタマイズ能力以外の多くのメリットはありませんが、ZPU EVO は Sharp MZ ハードウェアフレームワーク内で動作する全く新しい32ビットアーキテクチャを提供します。

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

まもなく Sharp MZ コンソールに座って ZPU または ARM バージョンの zOS を選択できるようになります。追加のプロセッサとオペレーティングシステムも可能で、75K/115K LE FPGAはそれらをホストする容量があるため、近い将来 68000 バージョンをポートするか、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 向けのバージョン1.2ボードの拡張映像機能だけでなく、ZPU EVO(lution) などのソフトCPUセットも提供します。このFPGAが提供する機能:

  • Sharp MZ シリーズの映像機能:MZ-80K、MZ-80C、MZ-1200、MZ-80A、MZ-700、MZ-80B(GRAM I/II を含む)。
  • カラーピクセルグラフィックスモード、8色 640x200、640x200 および 320x200。
  • 複数の映像出力モード:オリジナル、VGA 640x480@60Hz、VGA 800x600@60Hz、VGA 1024x768@60Hz。
  • T80 ソフトCPU:VHDLで書かれた Z80 互換プロセッサ。
  • ZPU EVO(lution) ソフトCPU:zOS オペレーティングシステムを動作させる32ビットスタックベースプロセッサ。
モジュール 説明
coreMZ.vhd トップレベル設計ファイル。回路のルートスケマティックに相当します。FPGAに入力するメインコンポーネント信号とその使用方法を定義します。
coreMZ_pkg.vhd 関数、定数宣言、パラメータを含むファイルで、コンパイル済みのすべてのVHDLファイル/モジュールで使用されます。
coreMZ_constraints.sdc Time Quest タイミングアナライザが作成・使用するタイミング制約ファイル。FPGA 内のコンポーネント配置を決定するコンパイラおよびフィッタでも使用されます。
VideoController/VideoController.vhd ビデオコントローラ設計ファイル。Sharp MZ 互換ビデオコントローラをインスタンス化するすべてのロジックを含みます。
VideoController/VideoController_pkg.vhd ビデオコントローラパッケージ設定ファイル。関数、定数宣言、パラメータを含み、コンパイル済みのすべてのVHDLファイル/モジュールで使用されます。
VideoController/VideoController_constraints.sdc ビデオコントローラのタイミング制約ファイル。
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 設計ファイル。
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 プロセッサの設定に関する関数、定数宣言、パラメータを含むファイル。
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 定義。

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'
    

    ライセンスファイルをお持ちの場合:

     コピー: <あなたのライセンスファイル> を 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 変数を xserver に向けて設定します:

     export DISPLAY=<xサーバーのIPまたはホスト名>:<スクリーン番号または :<スクリーン番号>>
     # 例: export DISPLAY=192.168.1.1:0
    

    X サーバーマシン上で次のコマンドを実行します:

     xhost +
     # またはプライベートネットワーク以外でセキュリティを維持する場合は xhost <dockerホストのIP>
    
  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 メモリへのファイルのアップロード・ダウンロード、ビデオフレームのキャプチャ、または新しいフレームの設定。
TZLOAD v1.2

コマンド:
  -h | --help              このヘルプテキスト。
  -d | --download <file>   tranZPUter のメモリ内容を保存するファイル。
  -u | --upload   <file>   内容を tranZPUter メモリにアップロードするファイル。
  -U | --uploadset <file>:<addr>,...,<file>:<addr>
                           指定された場所にファイルのセットをアップロード。--mainboard でメインボードをターゲットに指定。デフォルトは tranZPUter。
  -V | --video             指定された入力ファイルをビデオフレームバッファにアップロード、または指定された出力ファイルをビデオフレームバッファで埋める。

オプション:
  -a | --addr              読み書きするメモリアドレス。
  -l | --size              読み取るメモリブロックのサイズ。このオプションは tranZPUter メモリの読み取り時のみ使用。書き込み時はファイルサイズが使用される。
  -s | --swap              tranZPUter メモリを読み取って <infile> に保存し、同じメモリ位置に <outfile> を書き込む。
  -f | --fpga              操作は FPGA メモリで行われる。このフラグなしのデフォルトは tranZPUter メモリをターゲットとする。
  -m | --mainboard         操作は MZ80A メインボードで行われる。このフラグなしのデフォルトは tranZPUter メモリをターゲットとする。
  -M | --mempage           メインボードへの操作では操作前にすべての DRAM バンクをページイン。つまり MZ-700 は下位・上位 DRAM バンクをページインして 0000:FFFF = DRAM にする。
  -z | --mzf               ファイル操作でファイルを MZF フォーマットとして処理。--addr と --size が必要な場合は MZF ヘッダの値を上書き。
  -v | --verbose           より多くのメッセージを出力。

例:
  tzload --download monitor.rom -a 0x000000      # ファイル monitor.rom をアドレス 0x000000 の 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 ファイリングシステムは、MZ-80A ROM ディスクアップグレードボードで使用されている Rom Filing System を tranZPUter に移植したものです。同じソフトウェア機能の多くを再利用しているため、同等のサービスを提供しますが、異なるメモリモデルを使用している点が異なります。その目的は、SD カードに保存されたファイルを操作するメソッドと、拡張コマンドラインインターフェースである TZFS モニターを提供することです。コマンドセットには SD ファイルの操作・バックアップのほか、MZ700/800 コンピューターで見られる多数のコマンドが含まれます。

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

RFS ではソフトウェアを多数の ROM ページに分割してページングでアクセスする必要がありましたが、TZFS も同様です。ただし 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 カードディレクトリ <ディレクトリ> に切り替え。ディレクトリ未指定の場合はデフォルトの \MZF にリセット。ディレクトリ変更後、I/O プロセッサがディレクトリ内容をキャッシュするため DIR コマンドの出力に数秒かかる場合があります。
CPM なし SD カード上の CP/M 2.23 を検索し、ロードして実行。
D <アドレス>[<アドレス2>] <アドレス> から <アドレス2>(または 20 行)までのメモリを 16 進数および ASCII でダンプ。画面がいっぱいになると、キー入力があるまで出力を一時停止。

アドレス値なしで続けて「D」を入力すると、前回表示したアドレスの続きから表示。

ページング中に認識されるキー:
‘D’ - 次ページ、’U’ - 前ページ、’X’ - 終了、その他のキーは次の画面を表示。
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-800 として実行するが MZ-700 互換モードを強制したい場合などに使います。また、オリジナルのマシンメモリにソフトウェアをロードして実行するためにも使用します。現在のフラグ:
8 - MZ-800 ホスト上で MZ-800 モードを強制。
7 - MZ-800 ホスト上で MZ-700 モードを強制。
O - ホストメモリにロードしてオリジナルとして実行。
LCNX <名前> または
<ファイル番号>[,<ターゲットモデル>]
SD カードからメモリにファイルをロード(実行しない)。SD カードで <名前> または <ファイル番号> のファイルを検索し、見つかればロード(実行しない)。
<ターゲットモデル> は LC と同様。
M <アドレス> <アドレス> から始まるメモリ位置を編集・変更。
MZ [<マシン>] Sharp MZ シリーズハードウェアエミュレーターを起動。ホスト MZ-700 を MZ-80B などの別の MZ シリーズマシンをエミュレートするよう再構成します。

<マシン> はオプションパラメーターで、初期起動マシンを指定します。このオプションがない場合、初期マシンは 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 = 1024x768 @ 60Hz
3 = 800x600 @ 60Hz。
Z80 なし tranZPUter ボードに搭載されたオリジナルのハード Z80 プロセッサに切り替え。
ZPU なし FPGA 内の ZPU EVOlution プロセッサに切り替え、zOS オペレーティングシステムをブート。

ディレクトリ一覧コマンドでは、80 桁モード時に 4 列で出力が表示されます。

テープコマンド

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

テープロード

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)。

例: MZ-2000 マシン用に BASIC MZ-1Z001 をテープにコピーしたい場合で、ファイルの SD カード ID が「0C」のとき、カセットドライブにテープを入れて以下のコマンドを実行します:
    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 では不要な自己複製のブロックがインタープリター内にあり、この領域を追加機能のために使用しました。

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

以下の表はコマンド拡張一覧と簡単な説明です。
コマンド パラメーター 説明
LOAD ”[<ファイル名>]” 現在の SD カードディレクトリまたは CMT(カセット)でプログラム「<ファイル名>」を検索。<ファイル名> が指定されない場合は次の順番のファイルをロード。
ファイル名の代わりに TZFS インデックス指定子も使用できます。例: LOAD “1E” で SD カードの HEX 1E に保存されたプログラムをロード。
SAVE ”[<ファイル名>]” メモリ内のプログラムを現在の SD カードディレクトリまたは CMT(カセット)に「<ファイル名>」として保存。
<ファイル名> が指定されない場合は、0 から始まる連番の「DEFAULT<番号>」という名前で保存。
DIR ”[<ワイルドカード>]” 現在の SD カードディレクトリを TZFS 形式で一覧表示。指定した <ワイルドカード> フィルターを適用(例: 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 のバージョン、すなわち [Grant Searle](http://searle.wales/) 氏が彼の [multicomp プロジェクト](http://searle.x10host.com/Multicomp/index.html) 向けに LOAD/SAVE/SCREEN などのハードウェア依存コマンドを除いてバイナリ・16 進数変数を追加するよう調整した NASCOM v4.7b バージョンの BASIC を使用することにしました。このバージョンの Basic はレトロの世界でかなり多くのフォロワーを持ち、多数の既存 BASIC プログラムが存在します。また、追加コマンドによる拡張も比較的容易です。

インターネット上では NASCOM 4.7b のソースコードが 2 バージョン提供されています。オリジナルと、Grant Searle 氏が彼の multicomp プロジェクト 向けに LOAD/SAVE/SCREEN などのハードウェア依存コマンドを除いてバイナリ・16 進数変数を追加するよう調整したバージョンです。私はこの両方を組み合わせて第三のバージョンを作り、不足していたテープコマンドを含む利用可能なコマンドを書き加え、拡張しました。

プロジェクトの発展に伴い、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 マニュアル を参照してください。以下の表は MZ-80A ROM ディスクハードウェアに合わせて追加した拡張機能の概要です。

コマンド パラメーター 説明
CLOAD ”<ファイル名>” SD カードからカセットイメージ(トークン化された BASIC プログラム)をロード。
CSAVE ”<ファイル名>” 現在の BASIC プログラムをトークン化されたカセットイメージ形式で SD カードに保存。
LOAD ”<ファイル名>” SD カードから標準 ASCII テキスト BASIC プログラムをロード。
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 <ファイル>      変換するイメージファイル。
  -o | --output <ファイル>     変換済みデータの出力先ファイル。

オプション:-
  -l | --loadaddr <アドレス>   MZ80A BASIC 開始アドレス。NASCOM アドレスは正しい MZ80A アドレス設定に使用されます。
  -n | --nasaddr <アドレス>    オリジナル 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 に移植しており、豊富なアプリケーションが利用可能です。

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


パス

読みやすくするため、本章では以下の略称を対応するパスとして使用します。2 つのリポジトリを使用します。tranZPUter 用のプライマリリポジトリと、オペレーティングシステム用の zSoft です。

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 ガーバーファイル。各 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 フラッシュ 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 ツールの GUI バージョンには Windows を使用していますが、Windows 上での TZFS ビルドには時間を割いていません。今後、必要なツールをすべてインストールした Docker イメージを作成する予定ですが、それまでの間、Z80 コードのアセンブル、C プログラムのビルド、CP/M ソフトウェアおよび CP/M ディスクイメージの操作には、以下のツールを入手してインストールする必要があります。

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

   
ZPU GCC ToolChain ZPU 開発用 GCC ツールチェーン。/opt などの共通領域にインストールしてください。
Arduino Arduino 開発環境。豊富な Arduino ライブラリから K64F 版 zOS に機能を追加する場合以外は実質不要ですが、参考として記載。
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 で、USB または OpenSDA 経由で 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 カードにファイルをコピーします。

典型的なビルド手順については 以下 を参照してください。


CPM のビルド

CP/M のビルドには、CP/M ビルドセクション も参照してください。

tranZPUter 向けの CP/M バージョンは、特別な SD カードや圧縮された ROM イメージの準備が不要なため、ビルドが若干シンプルです。

CP/M システムは 4 つの部分に分けてビルドします:

1. CCP、BDOS、CBIOS スタブを含む cpm22.bin。
2. バンク化された CBIOS。プライマリソースは 0xF000:FFFF に位置する 4K ページと、
   別の 64K RAM ブロック内の最大 48K ページで構成されます。
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(生イメージ)または <cpm>/1M44/DSK(CPC 拡張形式ディスクイメージ)に生成されます。これらのイメージは <cpm> 内の CPM* で始まる各ディレクトリから 1.44MB ドライブイメージ 1 枚分として作成されます。なお、各ディレクトリは他のすべてのサポート済みディスク形式のイメージとしても対応するディレクトリ(例: 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>
# 第 1 パーティションは 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 パーティションは Sharp MZ-700 のメインプロセッサとして動作する ZPU Evo プロセッサ用ソフトウェアをホストします。

<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>
# <z-zOS>/main.hex を USB または OpenSDA 経由で 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>
# CPM のビルド
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>
# 電源を入れてください。自動起動フラグが作成されていれば、見慣れたモニターのサインオンメッセージに続いて +TZFS が表示されます。
<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>
# 自動起動フラグが作成されていない場合は、モニターに JE800 コマンドを入力して TZFS を初期化してください。

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

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


K64F MPU のフラッシュ

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

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

Teensy ツールでプログラムする場合、必要なファイルと実行ファイルはすべて zSoft リポジトリ内の <z-tools> ディレクトリにあります。

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

U6 実装時の Teensy プログラミングツールの詳細については、Teensy の 基本使用ガイド を参照してください。

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

部品表(BOM)

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

ソース: tranZPUter-SW-700_v1_3.sch
部品点数: 145

Ref 数量 単価 10個価格 100個価格 5個合計価格 10個価格合計 部品名 フットプリント 説明 ベンダー
C1, C3, C10, C11, C12, C13, 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, C47, C48, C49, C50, C51, C52, C53, C54, C56, C57, C58, C60, C61, C62, C64, C65, C66 53 0.01183 0.01183 0.00874 0.5915 1.183 100nF C C_0402 コンデンサ 100nF https://lcsc.com/product-detail/Multilayer-Ceramic-Capacitors-MLCC-SMD-SMT_FH-Guangdong-Fenghua-Advanced-Tech-0402B104K500NT_C1525.html
C2, C4, C5, C6, C7, C8, C9 7 0.01183 0.01183 0.00874 0.08281 0.08281 10uF C C_0805 コンデンサ 10uF https://lcsc.com/product-detail/Multilayer-Ceramic-Capacitors-MLCC-SMD-SMT_Samsung-Electro-Mechanics-CL21A106KOQNNNE_C15850.html
C14, C15 2 0.01183 0.01183 0.00874 0.02366 0.02366 18pF C C_0402 コンデンサ 18pF https://lcsc.com/product-detail/Multilayer-Ceramic-Capacitors-MLCC-SMD-SMT_FH-Guangdong-Fenghua-Advanced-Tech-0402CG180J500NT_C1554.html
C46, C55, C59, C63 4 0.01183 0.01183 0.00874 0.04732 0.04732 1uF C C_0402 コンデンサ 1uF https://lcsc.com/product-detail/Multilayer-Ceramic-Capacitors-MLCC-SMD-SMT_Samsung-Electro-Mechanics-CL05A105KO5NNNC_C52923.html
D1 1 0.02822 0.02822 0.01835 0.02822 0.02822 LED D LED_0805 LED https://lcsc.com/product-detail/Light-Emitting-Diodes-LED_Everlight-Elec-19-217-BHC-ZL1M2RY-3T_C72043.html
F1 1 0.04397 0.04397 0.03156 0.04397 0.04397 750mA Polyfuse Polyfuse_SMD_0805 ポリヒューズ 750mA https://lcsc.com/product-detail/Resettable-Fuses-PPTC_Bourns-MF-MSMF075-2_C17313.html
J1 1 0.26265 0.26265 0.19909 0.26265 0.26265 Micro_SD_Card Micro_SD_Card MicroSD_HC_Wuerth_693072010801 Micro SD カードソケット https://lcsc.com/product-detail/Memory-Card-Connectors_Molex-5033981892_C393941.html
J2 1 0.47393 0.47393 0.34318 0.47393 0.47393 USB_B_Micro USB_B_Micro USB_Micro-B_Wuerth_65100516121 USB Micro B コネクタ https://lcsc.com/product-detail/USB-Connectors_Amphenol-ICC-10118194-0001LF_C132563.html
J3 1 1.29 1.00 0.87 1.29 1.00 SD_Card SD_Card_Receptacle SD_Receptacle_Wuerth_693072010801 SD カードソケット https://www.mouser.co.uk/ProductDetail/Wurth-Elektronik/693072010801
JP1, JP2, JP3, JP4 4 0.04016 0.04016 0.02948 0.16064 0.16064 Jumper Jumper_3_Bridged12 PinHeader_1x03_P2.54mm_Vertical ジャンパー 3 ピン https://lcsc.com/product-detail/Pin-Headers_BOOMELE-Boom-Precision-Elec-C124378_C124378.html
JP5 1 0.04016 0.04016 0.02948 0.04016 0.04016 Jumper Jumper_2_Open PinHeader_1x02_P2.54mm_Vertical ジャンパー 2 ピン https://lcsc.com/product-detail/Pin-Headers_BOOMELE-Boom-Precision-Elec-C124378_C124378.html
R1, R5, R7 3 0.00246 0.00246 0.00196 0.00738 0.00738 10K R R_0402 抵抗 10K https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_UNI-ROYAL-Uniroyal-Elec-0402WGF1002TCE_C25744.html
R2, R3 2 0.00246 0.00246 0.00196 0.00492 0.00492 22R R R_0402 抵抗 22Ω https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_UNI-ROYAL-Uniroyal-Elec-0402WGF220JTCE_C25092.html
R4 1 0.00246 0.00246 0.00196 0.00246 0.00246 680R R R_0402 抵抗 680Ω https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_UNI-ROYAL-Uniroyal-Elec-0402WGF6800TCE_C23245.html
R6 1 0.00246 0.00246 0.00196 0.00246 0.00246 1K R R_0402 抵抗 1K https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_UNI-ROYAL-Uniroyal-Elec-0402WGF1001TCE_C11702.html
SW1 1 0.05742 0.05742 0.05259 0.05742 0.05742 SW_Push SW_Push SW_SPST_PTS645 プッシュスイッチ https://lcsc.com/product-detail/Tactile-Switches_C-K-PTS645SK43SMTR92-LFS_C221841.html
U1 1 3.1375 2.88455 2.7 3.1375 2.88455 MK64FX512VLQ12 MK64FX512VLQ12 LQFP-144_20x20mm_P0.5mm Freescale K64FX512 144LQFP マイクロコントローラー https://www.mouser.co.uk/ProductDetail/NXP-Semiconductors/MK64FX512VLQ12
U2 1 5.6 5.6 3.5 5.6 5.6 XC9572XL-10VQG64C XC9572XL VQFP-64_10x10mm_P0.5mm Xilinx XC9572XL CPLD https://www.ebay.co.uk/
U3 1 22.0 22.0 22.0 22.0 22.0 EP4CE10E22C8N EP4CE10E22C8N EQFP-144_20x20mm_P0.5mm Intel/Altera Cyclone IV FPGA https://www.ebay.co.uk/
U4 1 2.04 1.34 0.89 2.04 1.34 AS6C4008-55PCN AS6C4008 DIP-32_W15.24mm 512K x 8 スタティック RAM https://www.mouser.co.uk/ProductDetail/Alliance-Memory/AS6C4008-55PCN
U5 1 0.26 0.21 0.1767 0.26 0.21 74HCT126 74HCT126 SOIC-14_3.9x8.7mm_P1.27mm 3 ステートバスバッファ https://lcsc.com/product-detail/Logic-ICs_Nexperia-74HCT126D-652_C5966.html
U6 1 1.71282 1.56942 1.43842 1.71282 1.56942 MKL02Z32VFM4 MKL02Z32VFM4 QFN-16_3x3mm_P0.65mm PJRC ブート MCU(オプション) https://www.mouser.co.uk/ProductDetail/NXP-Semiconductors/MKL02Z32VFM4
Y1 1 0.36 0.36 0.254 0.36 0.36 16MHz Crystal Crystal_SMD_5032-2Pin_5.0x3.2mm 16MHz 水晶振動子 https://lcsc.com/product-detail/Crystals_Yangxing-Tech-X503216MSB4SI_C13738.html
Y2 1 0.36 0.36 0.254 0.36 0.36 50MHz Crystal Crystal_SMD_5032-2Pin_5.0x3.2mm 50MHz 水晶振動子 https://lcsc.com/product-detail/Crystals_Yangxing-Tech-X503250MSB4SI_C13737.html
PCB 1 29.5 29.5 29.5 29.5 29.5 PCB PCB   基板(10 枚単位) https://jlcpcb.com/
VAT @ 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 とマークされたソースおよびバイナリファイルはフリーソフトウェアです: フリーソフトウェア財団が発行する GNU 一般公衆ライセンス(バージョン 3、またはお好みによりそれ以降のバージョン)の条件の下で、再配布または改変することができます。

ソースファイルは有用であることを願って配布されますが、商品性または特定目的への適合性についての黙示的保証を含め、いかなる保証もありません。詳細については GNU 一般公衆ライセンスを参照してください。

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