tranZPUter SW-700
前書き
このプロジェクトは、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アセンブラで記述せざるを得ませんでした)。
概要
このアップグレードは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 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ファイルは常に変更中であるためアップロードされません。
ハードウェア
バスマスタリングは、メインメモリと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アップグレード回路図

上記の回路図は、ボードをMZ-700に取り付けた際にCPLDがマシンをオリジナルのまま(つまり電源投入時に追加機能が有効化されない)に設定するよう設計されています。Z80がCPLD I/Oレジスタに書き込むことで、必要に応じて機能を有効化できます。これにより、ソフトウェアとの互換性を最大限に維持するためにマシンをオリジナルのまま保つという要件が満たされます。
v1.2 K64 I/Oプロセッサ

組み込みデバッグ、開発、学習ツール、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プログラミングおよびオシレータ

この設計では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 電源

より高度なテクノロジーを使用するには、元の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 ビデオインターフェース

この設計における拡張ビデオの提供方法は、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用に完全に組み立て・テストされたプリント基板であり、実機に取り付けた状態の画像も掲載しています。




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アップグレード回路図

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

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

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

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

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


設計詳細
K64F Z80 ホストAPI
// コマンドサービス処理と結果のための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構成
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プロジェクト第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はこの制限を以下のように克服しています。
切り替え可能な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コードが使用する。 |
ソフトプロセッサ
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セクションで見つけることができます。
現在、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 — スタック用メモリの開始アドレス。 |
ビデオモジュール
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/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 十進)
このレジスタからの読み出しではビット7:0がポップされ、レジスタが右に8ビットシフトされます。
GPUコマンドレジスタ (0xF7 - 247 十進)
| コマンド | パラメータ | 説明 |
|---|---|---|
| 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 十進)
パレットは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 十進)
以下の表は現在のビデオモードとパラメータ番号の一覧です。アクティブモードはコントロールレジスタで設定され、パラメータはビデオモードパラメータレジスタから更新できます。
フロントポーチは 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 の互換モードも同様ですが、MZ-700 上で動作する Sharp MZ-80A ソフトウェア、および他の Sharp MZ モデルへの互換性を提供します。
以下のセクションでは現在の互換モードとリマッピングされるハードウェアについて説明します。
Sharp 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 |
キーボードマッピング
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-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リソースを利用した実現が可能になるはずです。
このモードは開発中であり、開発の進捗に応じて更新されます。
ハードウェア記述言語
ビットマップの作成方法はいくつかありますが、一般的にはソフトウェアのソースコードに似たハードウェア記述言語が使用されます。私は大学で学んだ 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ビットストリームのビルド
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.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としても動作します。
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 ビットストリームのビルド
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 ビットストリームのビルド
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
-
リポジトリをクローンします:
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 デバイスをサポートします。 -
X DISPLAY 変数を xserver に向けて設定します:
export DISPLAY=<xサーバーのIPまたはホスト名>:<スクリーン番号または :<スクリーン番号>> # 例: export DISPLAY=192.168.1.1:0X サーバーマシン上で次のコマンドを実行します:
xhost + # またはプライベートネットワーク以外でセキュリティを維持する場合は xhost <dockerホストのIP> -
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 -
提供されている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 ドライバをインストールしています。 -
Quartus Prime を停止するには:
# Quartus Prime メインGUIウィンドウで File->Exit から終了するか # または docker stop quartus
ソフトウェア
バージョン 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 コンピューターで見られる多数のコマンドが含まれます。
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
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 モニター
JE800<cr>
コンピューターを直接 TZFS で自動起動させることも可能です。そのためには、SD カードのルートディレクトリに以下の名前の空ファイルを作成してください:
'TZFSBOOT.FLG'
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 およびモードに切り替え。 |
| 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
インタープリターのバイト位置は重要です。一部のプログラムは既知の位置に関数があることを前提に書かれているため、逆アセンブルは正確に行い、変更・拡張はメインプログラムの外側で行う必要がありました。幸いなことに、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)。<周波数> 未指定の場合は元のマザーボード周波数に戻す。 |
CDC
LOAD
または
CDC
SAVE "EXAMPLE"
BASIC SA-5510 の新バージョンは「BASIC SA-5510-TZ」と命名されています。
注: ランダムファイルの読み書き BASIC 操作については、ロジックを完全に理解していないためまだ完全には実装していません。分析できる適切なプログラムが見つかり次第、CMT 仕様に従って TZFS を適応させます。
Microsoft BASIC
既存の 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 進数変数を追加するよう調整したバージョンです。私はこの両方を組み合わせて第三のバージョンを作り、不足していたテープコマンドを含む利用可能なコマンドを書き加え、拡張しました。
- 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 カセットイメージコンバーターツール
コンバーターはコマンドラインで動作するよう設計されており、その書式は以下の通りです:
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 のビルド手順は以下の通りです:
- <tools>/assemble_tzfs.sh を使用して TZFS バイナリを生成します。これにより、すべてのメインコードとバンクコードを含む ROM イメージ <roms>/tzfs.rom が作成されます。
- <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 が作成されます。
- 必要な Sharp MZF ファイルを MZF ディレクトリへコピーまたはそこから削除します。
- 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 版に置き換えられました。
Teensy ツールでプログラムする場合、必要なファイルと実行ファイルはすべて zSoft リポジトリ内の <z-tools> ディレクトリにあります。
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 の 基本使用ガイド を参照してください。
部品表(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 |
クレジット
ライセンス
GNU パブリックライセンス v3
ソースファイルは有用であることを願って配布されますが、商品性または特定目的への適合性についての黙示的保証を含め、いかなる保証もありません。詳細については GNU 一般公衆ライセンスを参照してください。
このプログラムとともに GNU 一般公衆ライセンスのコピーを受け取っているはずです。受け取っていない場合は http://www.gnu.org/licenses/ を参照してください。
