tranZPUter SW-700 (v1) — テクニカルガイド

tranZPUter SW-700 V1 テクニカルガイド

注意 — V1 ファームウェア(オリジナルリリース)
このガイドは tranZPUter SW-700 のオリジナル V1 ファームウェアを対象とし、Sharp MZ-700 のみをターゲットとしています。V1 では、ビデオ制御レジスタは I/O ポート 0xF8–0xFD にマップされており、0x6B システムコマンドレジスタは存在しません。MZ-2000 エミュレーションは V1 ではサポートされていません。

ボードファームウェアが現行リリース(I/O ポート再割り当てビルド後)に更新されている場合、ビデオレジスタは 0xA8–0xAD に、0x6B システムコマンドレジスタが存在します。その場合、代わりに tranZPUter SW-700 現行テクニカルガイドを参照してください。このドキュメントのレジスタアドレスは現行ファームウェアとは一致しません。
このガイドは tranZPUter SW-700 V1 のハードウェアアーキテクチャ、バスマスタリングメカニズム、メモリ管理サブシステム、システムレジスタインターフェース、K64F I/O プロセッササービス API、CPU 切り替え、V1 ビデオモジュールレジスタインターフェース、FPGA 仕様、完全なビルドシステムを解説します。オリジナルの V1 ファームウェアがシステムレベルでどのように機能するかを理解したい、または現行ファームウェアに更新されていないボードのリファレンスが必要なユーザー向けです。
日常的な使用と TZFS モニタコマンドリファレンスについては TZFS ユーザーマニュアルを参照してください。Z80 アセンブリソースコードのウォークスルーについては TZFS デベロッパーズガイドを参照してください。

バスマスタリング

tranZPUter SW-700 のコア原理は Z80 バスマスタリングです:オリジナルの Z80 CPU をトライステート化し、Sharp MZ-700 のアドレスバス、データバス、コントロールラインの完全な制御を取得する能力。このメカニズムは元々 DMA 用に開発されました — Z80 がプログラムループを実行するよりもはるかに速く、I/O デバイスとメモリの間でデータを転送するためです。tranZPUter はこれをすべての拡張機能の基盤として再利用しています。
バスマスタリングは tranZPUter SW-700 設計で 3 つの異なる目的に使用されます:
  • SD カードファイル I/O — K64F ARM プロセッサがバスを取得し、Z80 がまったく関与することなく SD カードと 512 KB SRAM の間でデータを直接転送する。
  • メニューとビデオオーバーレイの表示 — K64F がネイティブビデオ速度でメニューやステータス情報を表示するために MZ-700 ビデオ RAM に直接書き込むことができる。
  • ソフト CPU 実行 — ソフトプロセッサ(T80、ZPU Evolution)が FPGA でアクティブな場合、ハード Z80 は永続的にトライステート状態に保持され、ソフト CPU はローカル SRAM で実行し、必要に応じて制御された速度でのみ MZ-700 I/O とビデオ RAM にアクセスする。
設計は Z80 を娘基板に乗せます。いくつかの Z80 信号が CPLD を経由して再ルーティングされるため、I/O ポートレジスタへの書き込みでソフトウェア制御によるバスマスタリングをアサートできます。CPLD は任意の時点で 1 つのバスマスターのみがアクティブであることを確保し、5V MZ-700 マザーボード信号と 3.3V CPLD/FPGA ロジック間の電圧変換を処理します。

ハードウェアコンポーネント

tranZPUter SW-700 ボード(PCB バージョン v1.2 および v1.3)は以下の主要コンポーネントを搭載しています。ハードウェアは V1 ファームウェアと現行ファームウェアで同一です — ファームウェアバージョン間の違いはすべて CPLD ロジックと K64F ソフトウェアにあります。
コンポーネント パーツ 仕様
Z80 CPU Z84C0020(または同等品) 20MHz 定格;テストで 24MHz にオーバークロック
I/O プロセッサ Freescale K64F(MK64FN1M0VLL12) ARM Cortex-M4F、120MHz、256KB SRAM、1MB フラッシュ
CPLD Altera MAX7000A(EPM7512AETC144-10) 512 マクロセル、144ピン TQFP、5V 耐性入力
FPGA Altera Cyclone III EP3C25 または Cyclone IV EP4CE22/EP4CE75/EP4CE115 Cyclone IV 75K / 115K が v1.3 メインストリーム;Cyclone III は v1.2 で使用
FPGA 設定フラッシュ Altera EPCS16 FPGA ビットストリーム用 16Mbit シリアルフラッシュ
SRAM 512 KB スタティック RAM すべての TZFS ファームウェア、モニターイメージ、作業メモリを保持
SD カード microSD スロット K64F SPI に接続;FAT32 ファイルシステム
クリスタル FPGA メインタイムベース すべての内部およびビデオクロック用の FPGA PLL に供給
PCB リビジョン
  • v1.0 / v1.1 — 内部プロトタイプ設計、公開リリースなし。
  • v1.2 — 最初の公開リリース設計。Sharp MZ-80A tranZPUter SW v2.2 とビデオモジュール v2.0 をベースとし、MZ-700 プラットフォーム用に最適化。Cyclone III FPGA を使用。完全に機能するが FPGA リソースの上限が低い。
  • v1.3 — メインストリーム製品設計。Cyclone IV(75K または 115K ゲートカウント、ビルド時に選択可能)にアップグレードされ、より高い解像度グラフィックス機能、より多くのソフト CPU ヘッドルーム、追加のビデオモード用のスペースを提供。v1.2 と v1.3 はともに実証済みの設計;v1.2 は製造コストが低い。
CPLD の役割
MAX7000A CPLD は 3 つの理由でロジックキャパシティを超えて設計の中心です:
  • 電圧変換 — MZ-700 マザーボードは 5V で動作します。FPGA は 3.3V のみです。MAX7000A は 5V 耐性入力を持つため、両者の間に位置し、別個の変換 IC を必要とせずに両方向のレベルシフトを処理します。
  • デコードと I/O リマッピング — CPLD は Z80 I/O アドレスをデコードし、tranZPUter I/O レジスタセットを実装し、ソフト CPU が MZ-700 キーボードに正しくアクセスできるようにキーボード I/O をリマップします。
  • FPGA インターフェース — CPLD は FPGA が必要とする調整済みのバス信号を提供します。FPGA は I/O ピンに 3.3V しか許容できないため、CPLD 経由のルーティングは必須です。
電源
CPLD は 3.3V を必要とします。FPGA は内部コアに 1.2V、PLL とアナログセルに 2.5V、I/O バンクに 3.3V を必要とします。3 つの別個の LDO レギュレーター(それぞれ 1A 定格)が MZ-700 の 5V 電源からこれらのレールを提供します。K64F は専用の 3.3V LDO を使用し、スイッチングノイズのカップリングを防ぐために意図的に CPLD/FPGA 電源から分離されています。Altera の電力解析ツールを使用して、LDO 定格が CPLD と FPGA の合計負荷に十分であることを確認しました。
ビデオインターフェース
tranZPUter SW-700 は MZ-700 マザーボードから IC を取り外しません。代わりに、コンポジットビデオ信号はマザーボードモジュレータコネクタから取り出され、CPLD 経由(CPLD が 5V→3.3V 信号調整を処理)で FPGA に入力され、FPGA はオリジナルのビデオをそのまま通過させるか独自の強化されたビデオ出力を生成します。ソフトウェアはビデオ制御レジスタ(V1 では 0xF8–0xFD)への書き込みで 2 つのモードを選択します。FPGA ビデオがアクティブな場合、CPLD は競合を防ぐために関連するマザーボード信号をトライステート化します。
カラー出力はアナログ RGB パスに 1 チャンネルあたり 4 ビット、デジタル RGB モニターとモジュレータ内部のコンポジット/TV 回路用に 1 チャンネルあたり 5 ビット目を使用します。5 ビット目はモジュレータ入力が 2V(TTL スイッチングしきい値)を超えるようにします。アナログ RGB モニターを駆動する場合、5 ビット目はモニター入力を過飽和させないよう Low またはハイインピーダンスに保つ必要があります;5 ビット目が 0 の場合、電流シンクとして機能し出力電圧をわずかに下げ、1 チャンネルあたり 32 の使用可能な電圧レベルを提供します。

メモリ管理モード

tranZPUter SW-700 CPLD は I/O ポート 0x60(メモリ管理設定レジスタ)へのモードコードの書き込みで制御されるハードウェアメモリ管理ユニットを実装します。各モードは tranZPUter の 512 KB SRAM と MZ-700 マザーボードメモリが Z80 の 64 KB アドレス空間にどのようにマップされるかを異なる組み合わせで選択します。
V1 ファームウェアでは、以下の TZMM モードが定義されています。MZ-2000 固有のモードは存在しません — 現行ファームウェアリビジョンで追加されました。
モード コード 説明
TZMM_ORIG 0x00 オリジナル Sharp MZ-700 モード。マザーボードの ROM と RAM を直接使用。tranZPUter SRAM は見えない。K64F I/O レジスタは引き続きアクセス可能。
TZMM_BOOT 0x01 オリジナルモードだが 0xE800–0xEFFF が tranZPUter SRAM ブロック 0 にマップされ、TZFS ブートスタブが完全なファームウェアがアクティブになる前に実行して K64F にサービスリクエストを発行できるようにする。
TZMM_TZFS 0x02 TZFS メイン動作モード。tranZPUter SRAM のすべてのメモリ。モニターは 0x0000–0x0FFF、ユーザー RAM は 0x1000–0xCFFF、0xE800–0xEFFF の固定 TZFS ウィンドウ(ブロック 0)、0xF000–0xFFFF の切り替え可能ウィンドウ(デフォルトではブロック 0)。
TZMM_TZFS2 0x03 TZMM_TZFS と同じだが 0xF000–0xFFFF がブロック 1 にマップ(tzfs_bank2 — メッセージ印刷、ASCII 変換、ヘルプ画面)。
TZMM_TZFS3 0x04 0xF000–0xFFFF がブロック 2 にマップ(tzfs_bank3 — メモリユーティリティ、テープ速度補正、CPU 切り替え、MZ モデルエミュレーション)。
TZMM_TZFS4 0x05 0xF000–0xFFFF がブロック 3 にマップ(tzfs_bank4 — Z80 アセンブラ/ディスアセンブラ)。このバンクはアセンブラとディスアセンブラのテーブルに 0x1200–0xCFFF を追加使用(最大 52 KB 作業スペース)。
TZMM_CPM 0x06 CP/M モード。すべて SRAM、ブロック 4 がアドレス空間全体にマップ。
TZMM_CPM2 0x07 CP/M モード 2。0xF000–0xFFFF がブロック 4、0x0040–0xCFFF と 0xE800–0xEFFF がブロック 5。
TZMM_MZ700_0 0x08 MZ-700 互換: 下位 32 KB が SRAM、上位 32 KB がマザーボード(I/O マップ領域)。
TZMM_MZ700_1 0x09 MZ-700 互換: 下位 32 KB がマザーボード ROM/RAM、上位が SRAM。
TZMM_MZ700_2 0x0A MZ-700 互換: 0xE000–0xFFFF に SRAM オーバーレイを持つ完全なマザーボードマッピング。
TZMM_MZ700_3 0x0B MZ-700 互換: 完全なマザーボードメモリ、上位バンクに SRAM オーバーレイ。
TZMM_MZ800_0 0x0C MZ-800 エミュレーションメモリマップ、下位 SRAM。
TZMM_MZ800_1 0x0D MZ-800 エミュレーションメモリマップ、上位 SRAM。
TZMM_MZ80A 0x0E MZ-80A エミュレーション — MZ-80A メモリマップ通りに設定された完全な 64 KB SRAM。
TZMM_MZ80B 0x0F MZ-80B エミュレーション — MZ-80B メモリマップ通りに設定された完全な 64 KB SRAM。
すべてのアクティブな TZMM モードは CPLD によって内部的に TZMM_ENIOWAIT ビット(0x20)がセットされており、信頼性の高い K64F サービスリクエスト通信を確保するために I/O ウェイトステートを挿入します。Z80 はこのビットを明示的に設定する必要はありません。
TZMM_TZFS モードでの Z80 アドレス空間
アドレス     サイズ    内容
─────────────────────────────────────────────────────────────────────
0x0000      4 KB    モニター ROM 領域 — SA-1510(または 1Z-013A、MZ-80B IPL など)
                    起動時に K64F が SD カードからロード;SRAM ブロック 0 に常駐。
                    TZFS サービスコマンド経由で別のモニターイメージをロードすることで変更;
                    物理アドレス範囲は固定のまま。
0x1000      256 B   MZ-700 システム変数 / スタック
0x1200    ~46 KB    ユーザー RAM(メインプログラム領域)
0xCFFF
0xD000      12 KB   ビデオ RAM + メモリマップド I/O(Sharp MZ-700 マザーボードハードウェア)
0xE800       2 KB   TZFS 固定コードウィンドウ — 常に SRAM ブロック 0 にマップ。
                    プライマリ TZFS エントリーポイント、コマンドディスパッチャ、
                    外部ジャンプテーブル(0xE880)、共有変数領域を含む。
0xEC80      256 B   TZFS 変数(固定 0xE800–0xEFFF ウィンドウ内)
0xED80      640 B   K64F サービス通信ブロック(TZSVCMEM)
0xEFFF
0xF000       4 KB   切り替え可能コードウィンドウ — TZMM モードで選択された SRAM ブロック。
                    アクティブな TZFS バンクに応じて別の 64 KB SRAM ブロックにマップ
                    (tzfs_bank2 / bank3 / bank4 / CP/M)。
0xFFFF
─────────────────────────────────────────────────────────────────────

システムレジスタ(V1)

tranZPUter SW-700 は制御インターフェースを Z80 I/O ポートレジスタのセットとして公開します。V1 ファームウェアでは、システムレジスタはポート 0x60–0x6F を占有します。0x6B システムコマンドレジスタは V1 には存在しませんでした — 現行ファームウェアリリースで導入されました。
特に記載がない限り、すべてのレジスタは書き込み専用です。書き込み専用レジスタからの読み取りは未定義の動作をします。
ポート レジスタ 方向 説明
0x60 メモリ管理設定 W アクティブなメモリ管理モードを切り替えるために TZMM モードコードを書き込む。有効なコードについては上記のメモリモードテーブルを参照。
0x62 CPU 代替周波数設定 W Z80 クロックソースを K64F が生成する代替周波数に切り替える。周波数自体はまずポート 0x66 経由で設定する必要がある。
0x64 CPU ベース周波数設定 W Z80 クロックソースを MZ-700 マザーボード周波数(3.54 MHz)に戻す。
0x66 CPU 周波数変更 W 希望する代替 CPU 周波数を Hz 単位で書き込む(32 ビット値)。K64F はクロック出力を一致するように設定する。
0x68 サービスリクエスト W このポートに任意の値を書き込むと、0xED80 の TZSVCMEM ブロックにサービスリクエストがポストされていることを K64F に通知する。Z80 は完了のために TZSVCRESULT をポーリングする。
0x6C CPU 設定 W アクティブな CPU を選択する: 0 = ハード Z80(マザーボード)、1 = T80 ソフトコア Z80(FPGA)、2 = ZPU Evolution ソフト CPU(FPGA)。
0x6D CPU 情報 R このボードで利用可能な CPU 機能のビットマスクを返す。ビット定義はファームウェアバージョン固有;ハードウェア機能を検出するために起動時に読み取る。
0x6E システム設定 W/R システム機能の有効化/無効化フラグ。現在の設定を照会するために読み取る;変更するために書き込む。
0x6F システム情報 R ボード識別コードを返す。tranZPUter SW-700 ハードウェアが存在することを確認し PCB リビジョンを特定するために読み取る。
V1 注意: ポート 0x6B(システムコマンドレジスタ)は V1 ファームウェアには存在しません。V1 ファームウェアで 0x6B に書き込むコードは効果がないか、未定義の CPLD 動作を生成する場合があります。0x6B レジスタは完全な K64F サービスサイクルを経由せずに直接マシンモデル切り替えを提供するために現行ファームウェアリリースで追加されました。

K64F / I/O プロセッサ サービス API

V1 のすべての SD カードファイル I/O、モニターファームウェアロード、CP/M ディスクアクセスは K64F ARM Cortex-M4 I/O プロセッサによって実行されます。Z80 は SD カード SPI ハードウェアに直接アクセスしません — SRAM の共有メモリブロックを通じてリクエストをポストし、完了をポーリングします。K64F は組み込み OS(zOS)を実行し、Z80 からの保留中のリクエストをサービス通信ブロックで継続的にポーリングします。

サービスリクエストメカニズム
  1. Z80 は 0xED80 のサービス通信ブロックを埋めます: コマンドコードを TZSVCCMD に書き込み、必要なパラメータ(ファイル名、ロードアドレス、サイズなど)を設定し、TZSVCRESULTTZSVC_STATUS_REQUEST(0xFE)を書き込む。
  2. Z80 が K64F に通知するために I/O ポート 0x68(サービスリクエスト)に任意の値を書き込む。
  3. K64F がポート書き込みを検出し、SRAM からコマンドブロックを読み取り、作業中に TZSVCRESULTTZSVC_STATUS_PROCESSING(0xFF)に設定する。
  4. Z80 は値が 0xFF(処理中)でも 0xFE(リクエストがまだ見られていない)でもなくなるまでタイトループで TZSVCRESULT をポーリングする。他の値は完了を示す。
  5. 成功時、TZSVCRESULTTZSVC_STATUS_OK(0x00)。エラー時は非ゼロのエラーコードを保持する。結果データ(ディレクトリエントリ、ファイルブロックなど)はブロック内の TZSVCSECTOR バッファに置かれる。

サービス通信ブロック(0xED80、640 バイト)
オフセット  サイズ    フィールド            説明
────────────────────────────────────────────────────────────────────────────
+0x00   1 B     TZSVCCMD         サービスコマンドコード(下記のコマンドテーブル参照)
+0x01   1 B     TZSVCRESULT      結果/ステータスバイト(0x00=OK、0xFE=リクエスト、0xFF=ビジー)
+0x02   1 B     TZSVCDIRSEC      マルチブロックディレクトリ読み取り用ディレクトリセクター番号
+0x03   2 B     TZSVC_TRACK_NO   仮想ドライブトラック番号 / 32ビット LBA セクターアドレス
+0x05   2 B     TZSVC_SECTOR_NO  仮想ドライブセクター番号
+0x07   1 B     TZSVC_FILE_NO    ディレクトリ内のファイル番号
+0x08   1 B     TZSVC_FILE_TYPE  ファイルタイプ: 0=MZF、1=MZF ヘッダーのみ、2=CAS、3=BAS、10=ALL
+0x09   2 B     TZSVC_LOADADDR   動的ロードアドレス / 保存アドレス / CPU 周波数(Hz)
+0x0B   2 B     TZSVC_LOADSIZE   ロードまたは保存するバイト数
+0x0D  20 B     TZSVC_DIRNAME    ディレクトリ名(CHANGEDIR と READDIR 用)
+0x21  17 B     TZSVC_FILENAME   Sharp MZ ファイル名(17 文字、Sharp キャラクタエンコーディング)
+0x32  20 B     TZSVCWILDC       ディレクトリワイルドカードフィルタ文字列
+0x46 512 B     TZSVCSECTOR      データセクターバッファ — ファイルブロック、ディレクトリエントリなど
────────────────────────────────────────────────────────────────────────────
合計: 640 バイト(0xED80–0xEFFF、固定 TZFS ウィンドウ内)

サービスコマンド(V1)
コマンドは機能別にグループ化されています。Z80 はポート 0x68 経由でリクエストをトリガーする前に TZSVCCMD にコードを書き込みます。
現行ファームウェアとの V1 の違い: MZ-2000 IPL ローダーコマンド(0x26 LOAD2000IPL)と LOADTZFS コマンド(0x2F)は V1 には存在しません。他のすべてのファイル I/O、CP/M ディスク、CPU 周波数コマンドは存在します。
ファイルとディレクトリ操作
コード 名前 説明
0x01 READDIR TZSVC_DIRNAME で指定されたディレクトリを開き、TZSVCSECTOR に最初のエントリブロックを返す。
0x02 NEXTDIR 現在開いているディレクトリから次のエントリブロックを返す。
0x03 READFILE TZSVC_FILENAME で指定されたファイルを開き、TZSVCSECTOR に最初の 512 バイトブロックを返す。
0x04 NEXTREADFILE 開いているファイルの次の 512 バイトブロックを返す。
0x05 WRITEFILE 新しいファイルを作成し TZSVCSECTOR から最初の 512 バイトブロックを書き込む。
0x06 NEXTWRITEFILE 開いているファイルに次の 512 バイトブロックを書き込む。
0x07 CLOSE 現在開いているファイルまたはディレクトリハンドルを閉じる。
0x08 LOADFILE SD から tranZPUter SRAM の TZSVC_LOADADDR に完全なファイルを直接ロードする。
0x09 SAVEFILE tranZPUter SRAM の領域(TZSVC_LOADADDR から TZSVC_LOADSIZE バイト)をファイルとして保存する。
0x0A ERASEFILE TZSVC_FILENAME で指定されたファイルを SD カードから削除する。
0x0B CHANGEDIR アクティブな SD カードディレクトリを TZSVC_DIRNAME に変更する。
モニター / BIOS ロード
コード 名前 説明
0x20 LOAD40ABIOS 40 桁 SA-1510 モニターを SRAM の 0x0000 にロードする。
0x21 LOAD80ABIOS 80 桁 SA-1510 モニターを SRAM の 0x0000 にロードする。
0x22 LOAD700BIOS40 MZ-700 1Z-013A 40 桁モニターをロードする。
0x23 LOAD700BIOS80 MZ-700 1Z-013A 80 桁モニターをロードする。
0x24 LOAD80BIPL MZ-80B IPL ファームウェアをロードする。
0x25 LOAD800BIOS MZ-800 9Z-504M BIOS をロードする。
注意: コマンド 0x26(LOAD2000IPL — MZ-2000 IPL のロード)は V1 には存在しません。MZ-2000 エミュレーションは現行ファームウェアリリースで追加されました。コマンド 0x2F(LOADTZFS)も V1 には存在しません。
CP/M ディスク操作
コード 名前 説明
0x30 LOADBDOS CP/M BDOS+CCP を RAM に再ロードする(ウォームブートサポート)。
0x31 ADDSDDRIVE SD カードディスクイメージを CP/M ドライブレターに割り当てる。
0x32 READSDDRIVE SD カードディスクイメージから 128 バイトの CP/M セクターを読み取る。
0x33 WRITESDDRIVE SD カードディスクイメージに 128 バイトの CP/M セクターを書き込む。
CPU 周波数制御
コード 名前 説明
0x40 CPU_BASEFREQ Z80 クロックをマザーボードのベース周波数(3.54 MHz)に切り替える。
0x41 CPU_ALTFREQ K64F が提供する代替周波数に切り替える。
0x42 CPU_CHGFREQ TZSVC_LOADADDR の値(Hz 単位)に代替周波数を設定する。
CPU とハードウェアエミュレーション切り替え
コード 名前 説明
0x50 CPU_SETZ80 マザーボードのハード Z80 CPU に切り替える。
0x51 CPU_SETT80 必要なファームウェアをロードし、FPGA の T80 ソフトコア Z80 を有効化するよう FPGA に通知する。
0x52 CPU_SETZPUEVO 必要なファームウェアをロードし、FPGA の ZPU Evolution ソフト CPU を有効化するよう FPGA に通知する。
0x53–0x5C EMU_SETMZ* SD からターゲットマシン ROM/BIOS をロードし、その Sharp MZ モデルのエミュレーションを有効化するよう FPGA に通知する。MZ-2000(0x5D)は V1 では利用不可。
制御
コード 名前 説明
0x7F EXIT TZFS を終了して TZMM_ORIG モードで再起動し、マシンをネイティブファームウェアに戻す。

ステータスコード
名前 説明
0x00 TZSVC_STATUS_OK コマンドが正常に完了した。結果データがある場合は TZSVCSECTOR に。
0xFE TZSVC_STATUS_REQUEST Z80 がリクエストをポストし、K64F が確認するのを待っている。
0xFF TZSVC_STATUS_PROCESSING K64F が現在コマンドを実行中。Z80 はポーリングを続ける必要がある。

CPU 切り替え

tranZPUter SW-700 は 3 つの CPU モードをサポートします。CPU 設定レジスタ(ポート 0x6C)に直接書き込むか、K64F サービス API コマンド 0x50–0x52 を使用してソフトウェアで選択可能です。
利用可能な CPU
モード コード(0x6C) サービスコマンド 説明
ハード Z80 0x00 0x50 CPU_SETZ80 tranZPUter 娘基板のオリジナルの物理 Z80 チップがマザーボード周波数または K64F 生成代替周波数で動作する。電源投入後のデフォルト。
T80 ソフトコア 0x01 0x51 CPU_SETT80 CPLD/FPGA に実装されたオープンソース Z80 互換ソフトコア T80 がハード Z80 を置き換える。K64F がソフトコアを有効化する前に必要なファームウェアをロードする。
ZPU Evolution 0x02 0x52 CPU_SETZPUEVO FPGA に実装された ZPU Evolution ソフト CPU がハード Z80 を置き換える。ZPU 命令セットとその関連ツールチェーンの恩恵を受けるアプリケーションを意図している。
ソフト CPU に切り替えるとき、K64F は:
  1. BUSRQ 信号経由でハード Z80 をトライステート化する。
  2. 適切な SRAM 領域に必要なファームウェア(ブートベクタ、ROM イメージ)をロードする。
  3. リクエストされたソフトコアをインスタンス化してバスマスタシップをアサートするよう CPLD を通じて FPGA に通知する。
  4. TZFS サービスループに制御を返す。
T80 と ZPU Evolution は完全に SRAM で動作し、通常の Z80 バス信号経由で MZ-700 I/O とビデオ RAM にアクセスします — MZ-700 マザーボードのペリフェラルの観点からは、ハード Z80 と区別できません。
CPU 周波数制御
Z80 クロックソースは MZ-700 マザーボード発振器(3.54 MHz)と K64F によって合成された周波数の間で切り替えることができます。K64F 周波数ソースは連続可変で、24 MHz まで信頼性を持ってテストされています(Z84C0020 20 MHz デバイスをオーバークロック)。より高い周波数は可能ですが、信頼性は使用する特定の Z80 部品とボードキャパシタンスによります。
代替周波数を設定するための推奨シーケンス:
# 1. TZSVC_LOADADDR(32 ビット)に希望する周波数(Hz)を配置する

#    例: 16 MHz 用 16000000
LD  (TZSVC_LOADADDR), HL   ; 周波数の下位ワード

# 2. CPU_CHGFREQ サービスコマンド(0x42)を発行する
LD  A, 0x42
LD  (TZSVCCMD), A
LD  A, 0xFE
LD  (TZSVCRESULT), A
OUT (0x68), A              ; K64F をトリガー

# 3. TZSVCRESULT が 0x00(OK)になるまでポーリングする

# 4. 新しい周波数に切り替える
OUT (0x62), A              ; ポート 0x62 = CPU 代替周波数設定
MZ-700 ベース周波数に戻すには、ポート 0x64(CPU ベース周波数設定)に任意の値を書き込みます。

ビデオモジュール(V1 — ポート 0xF8–0xFD)

V1 ビデオレジスタアドレスの警告
V1 ファームウェアでは、ビデオ制御レジスタは I/O ポート 0xF8–0xFD にあります。現行ファームウェアでは、一般的な I/O ポート再割り当ての一部としてこれらのレジスタが 0xA8–0xAD に移動されました。0xF8–0xFD にアクセスする V1 向けのコードは現行ファームウェアでは動作せず、その逆も同様です。
tranZPUter SW-700 はビデオモジュール v2.0 の機能をボードに直接統合しています。FPGA は Sharp MZ シリーズの元のキャラクタディスプレイハードウェアをエミュレートし、カラーグラフィックスと複数の出力モードで拡張する強化されたビデオサブシステムを実装します。V1 ファームウェアでは、ビデオサブシステムはポート 0xF8–0xFD の 6 つの I/O レジスタを通じて制御されます。

ビデオレジスタマップ(V1)
ポート レジスタ 方向 説明
0xF8 制御 W プライマリビデオ制御レジスタ — マシンモデル、桁幅、カラーモード、PCG、VGA スキャンモードを選択する。
0xF9 グラフィックスモード W グラフィックス RAM バンク選択、VRAM/GRAM 出力有効、ピクセルブレンド演算子。
0xFA カラーライター赤 W 8 ピクセル赤カラーフィルター — 現在の 8 ピクセルグループのどのピクセルが赤成分を受け取るかを設定する。
0xFB カラーライター緑 W 8 ピクセル緑カラーフィルター — 現在の 8 ピクセルグループのどのピクセルが緑成分を受け取るかを設定する。
0xFC カラーライター青 W 8 ピクセル青カラーフィルター — 現在の 8 ピクセルグループのどのピクセルが青成分を受け取るかを設定する。
0xFD メモリページ / ステータス W/R GRAM→CPU マッピング(ビット 0)と CGROM→CPU マッピング(ビット 7)を制御する。ビデオステータスを取得するために読み取る。

制御レジスタ(0xF8)ビット定義
ビット    名前             説明
────────────────────────────────────────────────────────────────────────────
7:6     VGA モード       00 = オリジナル MZ-700 ビデオタイミング(15.6 kHz)
                         01 = VGA 640×200 アップスケール出力
                         10 = VGA 640×400 アップスケール出力
                         11 = 予約済み
5       PCG 有効         1 = プログラマブルキャラクタジェネレータアクティブ
                             (GRAM のカスタムキャラクタ定義が CGROM をオーバーライド)
                         0 = 標準 CGROM キャラクタ
4       カラー有効        1 = カラー属性 RAM アクティブ(カラーディスプレイ)
                         0 = モノクロディスプレイ
3       桁幅             1 = 80 桁ディスプレイ
                         0 = 40 桁ディスプレイ(MZ-700 デフォルト)
2:0     マシンモデル     000 = MZ-80K
                         001 = MZ-80C
                         010 = MZ-1200
                         011 = MZ-80A
                         100 = MZ-700(デフォルト)
                         101 = MZ-800
                         110 = MZ-80B
                         111 = 予約済み(MZ-2000 は V1 ではサポートされない)
────────────────────────────────────────────────────────────────────────────

グラフィックスモードレジスタ(0xF9)ビット定義
ビット    名前             説明
────────────────────────────────────────────────────────────────────────────
7:5     予約済み         0 でなければならない
4:3     GRAM バンク      カラーライターレジスタ(0xFA–0xFC)経由で書き込む際に
                         どのグラフィックス RAM バンクがアドレス指定されるかを選択する
2       VRAM 出力        1 = キャラクタ VRAM が最終ビデオ出力に寄与
                         0 = VRAM 抑制(GRAM のみ表示)
1       GRAM 出力        1 = グラフィックス RAM が最終ビデオ出力に寄与
                         0 = GRAM 抑制(VRAM のみ表示)
0       ブレンド演算子   0 = OR — GRAM と VRAM ピクセルが OR される
                         1 = XOR — GRAM と VRAM ピクセルが XOR される
────────────────────────────────────────────────────────────────────────────

カラーライターレジスタ(0xFA–0xFC)
カラーライターは個々のピクセル書き込みを経由せずに FPGA グラフィックス RAM にカラーを高速に描画するメカニズムを提供します。3 つのカラーライターレジスタのそれぞれは 8 ビットマスクを保持し、水平 8 ピクセルグループの各ピクセルに 1 ビットが対応します。レジスタ 0xFA(赤)、0xFB(緑)、0xFC(青)にマスクバイトを書き込むと、対応するビットがセットされているピクセルが、グラフィックスモードレジスタ(0xF9 ビット 4:3)で現在選択されているグラフィックス RAM バンクでそのカラーコンポーネントを受け取ります。
例 — 現在のグループのすべての 8 ピクセルをカバーするソリッドな赤の水平バーを書き込む:
LD  A, 0xFF
OUT (0xFA), A    ; すべての 8 ピクセルが赤を受け取る
XOR A
OUT (0xFB), A    ; 緑なし
OUT (0xFC), A    ; 青なし

メモリページ / ステータスレジスタ(0xFD)ビット定義
ビット    名前             説明
────────────────────────────────────────────────────────────────────────────
7       CGROM→CPU        1 = キャラクタジェネレータ ROM を CPU アドレス空間にマップ
                             (Z80 から読み取り可能)
                         0 = 通常動作;CGROM は CPU にマップされない
0       GRAM→CPU         1 = グラフィックス RAM を CPU アドレス空間にマップ
                             (ビデオ RAM ウィンドウ 0xD000–0xDFFF で Z80 から読み書き可能)
                         0 = 通常動作;GRAM は CPU にマップされない
────────────────────────────────────────────────────────────────────────────
ポート 0xFD を読み取るとビデオステータス情報が返されます。読み取りステータスの正確なビットレイアウトは V1 FPGA ビットストリームによって決定されます;確定的な定義については VHDL ソースを参照してください。
サポートされるマシンモデル(V1)
V1 ファームウェアは以下の Sharp MZ マシンビデオモードのエミュレーションをサポートします。MZ-2000 はサポートされません — 現行ファームウェアリリースで追加されました。
モデルコード(0xF8 のビット 2:0) マシン 備考
000 MZ-80K 40 桁モノクロ、オリジナル MZ キャラクタセット
001 MZ-80C 40 桁モノクロ
010 MZ-1200 40 桁モノクロ
011 MZ-80A 40 桁モノクロ;RFS/TZFS MZ-80A モニターと互換
100 MZ-700 40 桁カラー(デフォルト MZ-700 ハードウェアモード)
101 MZ-800 40/80 桁、拡張カラーモード
110 MZ-80B 40 桁モノクロ、MZ-80B キャラクタセット
111 (予約済み) MZ-2000 は V1 ではサポートされない

FPGA 仕様

FPGA はビデオサブシステム、すべてのソフト CPU インスタンス化、ビデオ出力信号生成を担当します。ビットストリームは EPCS16 シリアルフラッシュに格納され、電源投入時または CONFIG ボタンが押されたときに自動的にロードされます。
FPGA デバイスオプション
PCB リビジョン FPGA デバイス ゲートカウント 備考
v1.2 Altera Cyclone III EP3C25 25K LE 最初の製品設計。MZ-700 ビデオエミュレーションと T80/ZPU ソフト CPU に十分。
v1.3 Altera Cyclone IV EP4CE22 22K LE v1.3 ボード用エントリーレベル Cyclone IV オプション。
v1.3 Altera Cyclone IV EP4CE75 75K LE 標準 v1.3 メインストリーム。より高解像度グラフィックス;より多くのソフト CPU ヘッドルーム。
v1.3 Altera Cyclone IV EP4CE115 115K LE 最大容量オプション;ビルド時に選択可能。
FPGA クロックアーキテクチャ
メインボードのクリスタルは Cyclone III/IV FPGA に直接供給され、4 つのオンチップ PLL デバイスを使用してすべての内部同期クロックとビデオピクセルクロックを導出します。以下の外部クロックソースも同期目的で FPGA に供給されます:
  • SYSCLK — MZ-700 マザーボードシステムクロック(3.54 MHz)。マザーボードペリフェラルへの同期アクセスを可能にするために FPGA に供給される。
  • CTLCLK — K64F 生成の代替 CPU クロック。代替周波数でのソフト CPU 実行が FPGA 内部ファブリックと適切に同期されるように FPGA に供給される。
FPGA プログラミング
FPGA は JTAG インターフェース経由でプログラムされます。推奨されるデイジーチェーン設定では、JTAG チェーンは Altera のベストプラクティスに従い、最初に CPLD(高電圧デバイス)を通り、次に FPGA に渡ります。EPCS16 は Altera の組み込み EPCS プログラミング IP を使用して Cyclone III/IV 経由でプログラムされ、標準の JTAG コマンドを EPCS16 SPI プログラミングサイクルに変換します。EPCS16 が書き込まれると、FPGA はすべての電源サイクルまたは CONFIG リセット時に EPCS16 から自動的にビットストリームをロードします。

V1 vs 現行ファームウェア — 違いのまとめ

このセクションは、V1 ファームウェア(このガイドでカバー)と現行ファームウェアリリースの間のすべての既知の違いを要約します。別のソースのレジスタアドレス、コマンドコード、機能がこのガイドと一致しない場合は、そのソースが現行ファームウェアをカバーしているかどうかを確認してください。
I/O ポートアサインメント
機能 V1 アドレス 現行アドレス
ビデオ制御レジスタ 0xF8 0xA8
ビデオグラフィックスモードレジスタ 0xF9 0xA9
カラーライター赤 0xFA 0xAA
カラーライター緑 0xFB 0xAB
カラーライター青 0xFC 0xAC
メモリページ / ステータス 0xFD 0xAD
システムコマンドレジスタ 存在しない 0x6B
システムレジスタの違い
レジスタ V1 現行
0x6B システムコマンドレジスタ 存在しない 存在する — K64F サービスサイクルなしの直接マシンモデル切り替え
0x60–0x6F(他のすべてのシステムレジスタ) 存在する、同じ機能 存在する、同じ機能
K64F サービス API の違い
コマンド V1 現行
0x26 LOAD2000IPL 存在しない 存在する — MZ-2000 IPL ファームウェアをロード
0x2F LOADTZFS 存在しない 存在する — オンボードモニターのないマシン用 TZFS をロード
0x5D EMU_SETMZ2000 存在しない 存在する — MZ-2000 ハードウェアエミュレーションを有効化
他のすべてのコマンド(0x01–0x5C、0x7F) 存在する 存在する、同じ機能
マシンモデルサポート
マシン V1 現行
MZ-80K サポート サポート
MZ-80C サポート サポート
MZ-1200 サポート サポート
MZ-80A サポート サポート
MZ-700 サポート サポート
MZ-800 サポート サポート
MZ-80B サポート サポート
MZ-2000 サポートされない サポート
ファームウェア更新の互換性
V1 ファームウェアと現行ファームウェアはバイナリ互換性がありません。V1 から現行への更新には以下が必要です:
  1. 新しい CPLD ビットストリームのフラッシュ(新しい I/O ポートマップを実装し、0x6B を追加する)。
  2. 新しい FPGA ビットストリームのフラッシュ(MZ-2000 ビデオエミュレーションを実装し、ビデオレジスタを 0xA8–0xAD に再マップする)。
  3. K64F ファームウェアの更新(LOAD2000IPL、LOADTZFS、EMU_SETMZ2000 サービスコマンドを追加する)。
  4. SD カードの TZFS Z80 ファームウェアの更新(新しいレジスタアドレスと新しいサービスコマンドを使用するよう更新する)。
4 つのコンポーネントすべてを一緒に更新する必要があります。V1 TZFS と現行 CPLD ファームウェアを混在させる(またはその逆)と、誤ったビデオレジスタアクセスと予測できない動作が生じます。

ビルドシステム

すべての開発は Linux(Debian/Ubuntu)で行われます。ビルドシステムは tranZPUter リポジトリ内に自己完結しています。V1 ファームウェアは現行ファームウェアとは別の git ブランチに存在します。

前提条件
ツール 目的
Java JRE 8+ GLASS Z80 アセンブラ(tools/glass.jar)を実行する。javaPATH にある必要がある。
bash すべてのビルドスクリプトは bash シェルスクリプト。
perl MZF ファイル操作用の tools/mzftool.pl に必要。
gcc / make 最初のビルドで cpmtools をソースからコンパイル(自動)。
Quartus II / Quartus Prime CPLD と FPGA ビットストリームの再ビルドに必要。Z80 ファームウェアのみのビルドには不要。
dd、cat、stat パッケージングスクリプトで使用される標準 Linux ユーティリティ。
GLASS Z80 アセンブラは tools/glass.jar としてバンドルされています — Z80 ファームウェアと SD カードイメージをビルドするために別途 Quartus のインストールは不要です。

ビルドフラグ
asm/include/tzfs_definitions.asm を編集して適切なターゲットと機能フラグを設定します。V1 MZ-700 ビルドの標準設定は:
フラグ V1 デフォルト 説明
BUILD_MZ700 EQU 1 1 Sharp MZ-700 ホストマシン(V1 の唯一のターゲット)
BUILD_MZ80A EQU 0 0 Sharp MZ-80A ホストマシン
BUILD_MZ1500 EQU 0 0 Sharp MZ-1500 ホストマシン
BUILD_MZ2000 EQU 0 0 V1 ではサポートされない
ENADEBUG EQU 0 0 アセンブリ時デバッグ出力を有効化

ビルド手順
git clone https://git.eaw.app/eaw/tranZPUter.git
cd tranZPUter


# V1 ファームウェアブランチをチェックアウト:
git checkout v1


# 完全ビルド:
./build.sh
build.sh は以下の手順を順番に実行します:
  1. ソースから cpmtools をコンパイルし(最初の実行のみ)PATH に追加する。
  2. tools/assemble_tzfs.sh — V1 I/O レジスタマップ(0xF8–0xFD のビデオレジスタ、0x6B なし)をターゲットとして tzfs.asm とすべてのバンクファイル(tzfs_bank2.asmtzfs_bank3.asmtzfs_bank4.asm)をバイナリイメージにアセンブルする。
  3. tools/assemble_cpm.sh — CP/M 2.2 CBIOS を SRAM イメージにアセンブルする。
  4. tools/assemble_roms.sh — すべてのモニターファームウェアバリアント(SA-1510 40/80col、1Z-013A 40/80col、MZ-80B IPL)と MZF アプリケーションイメージをアセンブルする。
  5. tools/make_cpmdisks.sh — CP/M ディスクイメージ(K64F が READSDDRIVE / WRITESDDRIVE 経由で提供する RAW フォーマット)をビルドする。
K64F ファームウェアは ARM GCC ツールチェーンを使用して別途コンパイルされます。K64F バイナリとすべての TZFS/モニターイメージは、K64F zOS が期待するディレクトリレイアウトで SD カードにコピーする必要があります。期待される SD カードディレクトリ構造については K64F ファームウェアドキュメントを参照してください。

出力ファイル
ビルドが成功すると、roms/ ディレクトリに以下が含まれます:
ファイル 説明
tzfs.bin プライマリ TZFS イメージ — 固定ウィンドウコード(0xE800–0xEFFF、ブロック 0)。V1 レジスタアドレスでビルド。
tzfs_bank2.bin バンク 2 イメージ — メッセージ印刷、ヘルプ画面(0xF000–0xFFFF にページ)。
tzfs_bank3.bin バンク 3 イメージ — メモリユーティリティ、I/O、CPU 切り替え(0xF000–0xFFFF にページ)。
tzfs_bank4.bin バンク 4 イメージ — Z80 アセンブラとディスアセンブラ(ページ、52 KB 使用)。
monitor_SA1510.bin SA-1510 40 桁モニターイメージ(0x0000–0x0FFF)。
monitor_80c_SA1510.bin SA-1510 80 桁モニターイメージ。
monitor_1Z-013A.bin MZ-700 用 1Z-013A 40 桁モニターイメージ。
monitor_80c_1Z-013A.bin MZ-700 用 1Z-013A 80 桁モニターイメージ。
MZ80B_IPL.bin MZ-80B IPL イメージ。
cbios.bin CP/M 2.2 CBIOS SRAM イメージ。
CPM_DISK_*.img CP/M ディスクイメージ(RAW フォーマット)。

参考サイト

リソース リンク
tranZPUter SW-700 プロジェクトページ /transzputer-sw-700/
tranZPUter SW-700 V1 README /transzputer-sw-700-v1/
tranZPUter SW-700 現行テクニカルガイド /transzputer-sw-700-technicalguide/
TZFS ユーザーマニュアル /sharpmz-upgrades-tzfs-usermanual/
TZFS デベロッパーズガイド /sharpmz-upgrades-tzfs-developersguide/
TZFS テクニカルガイド /sharpmz-upgrades-tzfs-technicalguide/
tranZPUter SW プロジェクトページ /transzputer-sw/
tranZPUter Fusion プロジェクトページ /transzputer-fusion/
ビデオモジュールテクニカルガイド /video-module-technicalguide/
RFS テクニカルガイド /sharpmz-upgrades-rfs-technicalguide/
GLASS Z80 アセンブラ tools/glass.jar としてバンドル済み