Sharp MZ-80A ビデオモジュール — テクニカルガイド
Sharp MZ-80A Video Module テクニカルガイド
このガイドは、Sharp MZ-80A Video Module の内部アーキテクチャ、メモリマップ、プログラマブルレジスターセット、GPU コマンドインターフェイス、ビデオタイミングモード、ビルドシステムを解説します。すべての 3 つのハードウェアバージョン(v1.0 プロトタイプ、v1.1 推奨ディスクリート設計、v2.0 FPGA ベース設計)をカバーします。ハードウェア開発者、ファームウェア作成者、システムレベルで Video Module を理解またはプログラムする必要があるすべての方を対象としています。
日常的な使用とインストール手順については Video Module プロジェクトページ を参照してください。
ハードウェアバージョン
Video Module には 3 つのハードウェアバージョンがあります。MZ-80A で Sharp が無効にした 80 列機能を復元してカラー出力を追加するという共通の目的を持ちますが、実装が大きく異なります。v1.0 は既知の問題を持つプロトタイプで、新しいビルドには推奨されません。v1.1 はディスクリートロジックですべての v1.0 の問題を修正し、tranZPUter ボードが利用できない場合の推奨選択肢です。v2.0 は CPLD と FPGA テクノロジーを使用し、事前に取り付けられた tranZPUter ボードが必要で、実際のハードウェアで Sharp MZ エミュレーターの完全なビデオ機能を提供します。
v1.0 — プロトタイプ
v1.0 ボードは最初のプロトタイプでした。製造と使用中に 5 つの問題が発見されました:
v1.1 — 現行ディスクリート設計(推奨)
- KiCad でゲートアレイフットプリントが入れ替わっていた。 MB14298 と MB14299 のフットプリントが転置されていました。組み立て済みボードでの修正には精密なはんだ付けと再配線が必要でした。
- 発振器の信号品質。 発振器がクリーンな信号を生成しませんでした。U14B ピン 4 と GND の間に 100pF のセラミックコンデンサを追加することで解決されましたが、問題は問題 1 で必要な再配線によって複合化されていました。
- ゲートアレイ G 信号の PCB 断線。 2 つのゲートアレイ間の G 信号は、回路図に正しく示されているにもかかわらず PCB では未接続でした。手動のジャンパーワイヤーが必要でした。
- 0xDFFF での属性 RAM と制御ラッチのアドレスクラッシュ。 制御ラッチへの書き込みが属性 RAM ミラーの最上部の位置も更新し、キャラクター RAM がディスプレイの下部にハードウェアスクロールされた場合に最後に見える属性が破損する可能性がありました。
- 物理的な位置合わせの問題。 ゲートアレイのレイザーピンの位置が正確に測定されておらず、インストール中に困難が生じ、レイザーピンに負荷がかかりました。
v1.1 は再設計された PCB で 5 つの v1.0 の問題をすべて解決します:
v2.0 — FPGA 設計
- 問題 1、2、5 は、KiCad フットプリントの修正、ディスクリート発振器コンポーネントから発振器モジュールへの変更、ゲートアレイレイザーピン位置の精密測定(マイクロメーター検証を伴う MZ-80A マザーボードの鉛筆トレース)によって解決されました。
- 問題 3 は修正された回路図と PCB ルーティングで解決されました。
- 問題 4 は 74HCT123 モノステーブルマルチバイブレーター回路を追加することで解決されました。0xDFFF で読み取りが発生するとモノステーブルがトリガーされ、約 1 つの Z80 命令サイクルのウィンドウが開き、その間に 0xDFFF への後続の書き込みが属性 RAM ではなく制御ラッチ(IC U11)に向けられます。これにより HL=0xDFFF の
LD A,(HL); LD (HL),Bシーケンスでラッチを安全に更新できます。読み取りの直後に来ない 0xDFFF への書き込みは通常通り属性 RAM に行きます。
v2.0 はすべてのディスクリートロジックを、バスインターフェイスとレベル変換用の Altera MAX 7000A CPLD と、完全なソフトウェア定義ビデオコントローラー用の Altera Cyclone III FPGA(EP3C25E144C8)に置き換えます。FPGA はすべてのビデオ RAM、属性 RAM、キャラクタージェネレーター RAM、グラフィクスフレームバッファを内部のブロック RAM として保持し、すべての外部ビデオメモリチップを排除します。Video Module はマザーボードの拡張コネクタだけでは利用できない tranZPUter から転送される信号を必要とするため、v2.0 を取り付ける前に tranZPUter ボードを取り付ける必要があります。
v2.0 が提供する機能:
- すべての Sharp MZ シリーズビデオモードの完全エミュレーション:MZ-80K、MZ-80C、MZ-1200、MZ-80A、MZ-700、MZ-80B(GRAM I と II を含む)、MZ-800、MZ-2000。
- ネイティブ 15.62kHz 水平スキャンレートに加えて、640×480、800×600、1024×768 の 60Hz での VGA 出力。
- 640×200(80 列モード)または 320×200(40 列モード)の解像度と 8 色出力を持つ 8 色ピクセルグラフィクスフレームバッファ。
- CPU でアップロード可能なプログラマブルキャラクタージェネレーター RAM(CGRAM)。
- VRAM と GRAM のクリア/フィルコマンドを持つ GPU。
- 256 エントリーのプログラマブルパレットシステム。
- 640×200 を除くすべてのモードでのダブルバッファリング表示(その解像度では完全な 2 つのバッファには十分なブロック RAM が不足しています)。
v1.x ハードウェアアーキテクチャ
v1.x 設計は、ディスクリートの 74HCT シリーズロジック、属性 RAM 用の 2KB SRAM、キャラクタージェネレーター用の 32KB Flash RAM を使用してカラーと 40/80 列回路を実装します。ゲートアレイ IC20 と IC31(MB14298 と MB14299)は MZ-80A マザーボードから持ち上げられ、信号接続を変更できる娘基板に再設置されます。MZ-80A マザーボードの信号はカットされず、変更は完全に可逆的です。
メモリマップ
v1.x ボードは標準の MZ-80A アドレス空間に 2 つの新しいメモリマップされた領域を追加します。0xD000–0xD7FF のキャラクター RAM は元のマシンから変更されていません。属性 RAM と制御ラッチは 0xD800–0xDFFF を占有します:
アドレス サイズ 内容
───────────────────────────────────────────────────────────────────
0xD000–0xD7FF 2 KB キャラクター RAM — 表示文字、元の MZ-80A から変更なし。
CPU 読み書き。ビデオハードウェアが各フレームでスキャン。
0xD800–0xDFFF 2 KB 属性 RAM(IC U6、2KB SRAM)— 色と CG-ROM 選択。
各バイトは対応するキャラクター RAM の位置とペアになります。
0xD800–0xDFFE は CPU 読み書き。
0xDFFF 制御ラッチ(74HCT373、IC U9 v1.0 / IC U11 v1.1)— 書き込み専用。
アドレスは属性 RAM の最上位バイトと共有。
v1.1 では:ラッチを対象とする書き込みの直前に 0xDFFF の読み取りが必要
(モノステーブル回路の説明を参照)。
───────────────────────────────────────────────────────────────────
属性 RAM
IC U6 の 2KB SRAM は 0xD800–0xDFFF にマッピングされます。属性 RAM の各バイトはキャラクター RAM(0xD000–0xD7FF)の同じオフセットの文字に対応します。ビデオスキャン回路は両方の RAM を並列に読み取ります。各文字バイトが表示のためにシリアル化されると、対応する属性バイトが IC U7 でラッチされ、色と CG-ROM 選択信号の生成に使用されます。
属性バイトのレイアウトは次のとおりです:
| ビット | フィールド | 説明 |
|---|---|---|
| 0 | 背景青 | 背景色の青チャンネル(1=オン)。 |
| 1 | 背景赤 | 背景色の赤チャンネル(1=オン)。 |
| 2 | 背景緑 | 背景色の緑チャンネル(1=オン)。 |
| 3 | CG-ROM サブセレクトビット 0 | アクティブグループ内の 4 つの CG-ROM スロットの 1 つを選択(ビット 7 と組み合わせ)。 |
| 4 | 前景青 | 前景色の青チャンネル(1=オン)。 |
| 5 | 前景赤 | 前景色の赤チャンネル(1=オン)。 |
| 6 | 前景緑 | 前景色の緑チャンネル(1=オン)。 |
| 7 | CG-ROM サブセレクトビット 1 | アクティブグループ内の 4 つの CG-ROM スロットの 1 つを選択(ビット 3 と組み合わせ)。 |
例:スクリーン位置(0,0)に文字 'A'(0x41)を黒い背景に青い前景で表示するには、0xD000 に 0x41 を書き込み、0xD800 に 0x10 を書き込みます。属性バイトのビット 4 が青い前景チャンネルを設定し、ビット 2:0 がゼロで黒い背景を示します。CG-ROM サブセレクトビット 7 と 3 は両方ゼロで、アクティブグループのスロット 0 を選択します。
色生成
元の Sharp MZ-80A は、1982 年のユーザーマニュアル(非常に希少なエディション)に記載されているように、カラー出力ボードを持つことを Sharp が意図していました。Nibbles Lab がこのドキュメントに基づく動作する回路設計を発見・公開しました。v1.x Video Module はコンポジットビデオ出力のための変更を加えてこの回路を実装します。
色はデジタル的に生成されます — 各 RGB チャンネルは完全にオンかオフのいずれかで、8 つの可能な前景色と 8 つの可能な背景色を与えます。前景 RGB は属性ビット 6(G)、5(R)、4(B)で駆動され、背景 RGB はビット 2(G)、1(R)、0(B)で駆動されます。生成されたデジタル信号は前景と背景の別々の抵抗ネットワークに送られ、RGB モニターに適したアナログ電圧レベルを生成します。トランジスタ Q1 が RGB 出力を合成同期信号とブレンドしてコンポジットモニター出力を提供します。
利用可能な色:
| ビット 6,5,4(前景)または 2,1,0(背景) | 色 |
|---|---|
| 0,0,0 | 黒 |
| 0,0,1 | 青 |
| 0,1,0 | 赤 |
| 0,1,1 | マゼンタ |
| 1,0,0 | 緑 |
| 1,0,1 | シアン |
| 1,1,0 | 黄 |
| 1,1,1 | 白 |
制御ラッチは、アドレス 0xDFFF に書き込み専用でマッピングされた 74HCT373 オクタル透明ラッチ(v1.0 では IC U9、v1.1 では IC U11)です。40/80 列モードと CG-ROM グループ選択を制御します。ラッチアドレスは属性 RAM の最上位バイトと共有されています。v1.0 ではこの共有が破損を引き起こす可能性がありましたが、v1.1 では 74HCT123 モノステーブル回路が、0xDFFF の読み取り直後に続く書き込みはラッチを対象とし、その他の 0xDFFF への書き込みは属性 RAM に行くことを保証します。
制御ラッチのビットマップ:
| ビット | 機能 | 説明 |
|---|---|---|
| 0 | CG-ROM グループ選択ビット 0 | ビット 1 と組み合わせて、32KB Flash 内の 4 グループの 4 CG-ROM スロットの 1 つを選択します。 |
| 1 | CG-ROM グループ選択ビット 1 | |
| 2–6 | 未使用 | 予約済み、0 として書き込む必要があります。 |
| 7 | 40/80 列選択 | 0 = 40 列(デフォルト)。1 = 80 列。 |
v1.1 ソフトウェアで 80 列モードに切り替えるには、リード-モディファイ-ライトシーケンスを使用します:
LD HL, 0xDFFF ; ターゲットアドレス
LD B, 0x80 ; ラッチする値(ビット 7 = 80 列有効)
LD A, (HL) ; 0xDFFF を読み取る — モノステーブルをトリガーし、ラッチウィンドウを開く
LD (HL), B ; ウィンドウ内で書き込む — 属性 RAM ではなく制御ラッチに行く
モノステーブルパルスは 1 つの Z80 命令サイクルをわずかに超えて消滅するようにサイズ設定されています。読み取り(LD A,(HL))とその直後の書き込み(LD (HL),B)はウィンドウ内に収まります。読み取りと書き込みの間に NOP や他の命令があるとウィンドウが閉じ、書き込みは代わりに属性 RAM に向けられます。
40/80 列回路
Sharp MZ-80A は MZ-80B ビジネスマシンと同じビデオチップセットを含んでいますが、おそらくマーケティングの差別化のために 80 列出力を無効化するように Sharp が異なる配線をしていました。v1.x 設計は、ゲートアレイ IC20 と IC31(MB14298 と MB14299)を MZ-80A マザーボードから持ち上げ、相互接続を MZ-80B 設定に合わせて変更できる娘基板に再設置することで MZ-80B 回路を復元します。
80 列モードには 2 倍のピクセルクロックが必要です。娘基板の専用発振器モジュールがこのクロックを提供します。0xDFFF の制御ラッチのビット 7 が標準の 40 列クロックと倍の 80 列クロックを選択します。40/80 切り替えは即座に有効になります。モードを切り替えた後、ソフトウェアはディスプレイを再初期化する必要があります。
MZ-80A マザーボードの IC8(74LS165)は取り外してソケットを取り付ける必要があります。Video Module が新しいロードとクロック信号をシリアライザーに注入する必要があるためです。これがマザーボードへの唯一の永続的な変更です。元の 74LS165 を再設置すれば工場出荷時の状態に戻せます。
キャラクタージェネレーター ROM システム
元の 2KB キャラクタージェネレーター ROM(MZ-80A マザーボードの IC15)は取り外され、娘基板上の IC U10 である 32KB 28C256 Flash RAM に置き換えられます。この Flash は各 2KB の最大 16 個の CG-ROM イメージ、または各 4KB の最大 8 個のイメージ(2 つの連続する 2KB スロットを占有)を格納します。
32KB Flash アドレス空間は 4 グループの 4 スロットに分割されています。アクティブなグループは制御ラッチビット 1:0 で選択されます。アクティブなグループ内で、各文字の属性ビット 7 と 3 がその文字のグリフデータに使用される 4 スロットのどれかを選択します。これにより画面上のすべての文字が独立してアクティブグループの 4 スロットのいずれかからグリフを描画できます。
Flash アドレス = (ラッチビット 1:0) × 8KB + (属性ビット 7,3) × 2KB + char_offset ラッチビット 1:0 → グループ(A14:A13):4 つの 8KB 領域の 1 つを選択 属性ビット 7,3 → スロット(A12:A11):グループ内の 4 つの 2KB スロットの 1 つを選択 文字 + 行 → A10:A0:2KB スロット内のグリフバイトアドレス
COLOURBOARD_CG.rom イメージに同梱されている現在のスロット割り当て:
| スロット | 属性ビット 7,3 | ラッチビット 1:0 | サイズ | ROM ファイル | 説明 |
|---|---|---|---|---|---|
| 0 | 0,0 | 0,0 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 1 | 0,1 | 0,0 | 2 KB | MZ80K_cgrom.rom | MZ-80K ヨーロッパ CG-ROM |
| 2 | 1,0 | 0,0 | 2 KB | MZ80K2E_Jap_cgrom.rom | MZ-80K 日本語 CG-ROM |
| 3 | 1,1 | 0,0 | 2 KB | MZFONT.rom | 不明な出所の CG-ROM |
| 4–5 | 0,0–0,1 | 0,1 | 4 KB | MZ700_cgrom.rom | MZ-700 ヨーロッパ CG-ROM(2 スロット) |
| 6–7 | 1,0–1,1 | 0,1 | 4 KB | MZ700_cgrom_jp.rom | MZ-700 日本語 CG-ROM(2 スロット) |
| 8 | 0,0 | 1,0 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 9 | 0,1 | 1,0 | 2 KB | MZ80B.rom | MZ-80B ヨーロッパ CG-ROM |
| 10 | 1,0 | 1,0 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 11 | 1,1 | 1,0 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 12 | 0,0 | 1,1 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 13 | 0,1 | 1,1 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 14 | 1,0 | 1,1 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
| 15 | 1,1 | 1,1 | 2 KB | mz-80acg.rom | MZ-80A ヨーロッパ CG-ROM |
v2.0 ハードウェアアーキテクチャ
v2.0 ボードは v1.x 設計のすべてのディスクリートロジック、再配置されたゲートアレイ、SRAM、Flash RAM の代わりに 2 つのプログラマブルロジックデバイスを使用します。CPLD が 5V/3.3V の境界とバス制御を処理し、FPGA が完全なビデオシステムを内部ブロック RAM とロジック要素で実装します。
CPLD — Altera MAX 7000A(EPM7128S)
CPLD(Complex Programmable Logic Device)は、84 ピン PLCC パッケージの Altera MAX 7000A デバイス、部品番号 EPM7128S です。MAX 7000A デバイスはすべての I/O ピンで 5V トレラントです。これが選択の主な理由です:Sharp MZ-80A の Z80 バスは 5V で動作し、FPGA I/O は 3.3V であり、5V 信号を標準の 3.3V FPGA 入力に直接接続するとデバイスが損傷します。
CPLD は以下の機能を実行します:
FPGA — Altera Cyclone III(EP3C25E144C8)
- 電圧レベル変換 — MZ-80A バスからのすべての信号(アドレスバス A0–A15、データバス D0–D7、制御信号 MREQ、IORQ、RD、WR、BUSACK)は CPLD の 5V トレラント入力で受け取られ、FPGA 用に 3.3V で再駆動されます。
- クロック生成と調整 — MZ-80A マスター発振器は 17.7341MHz(ゲートアレイから派生した MZ-80B ピクセルクロック)で動作します。CPLD はこのクロックを分周して 40 列モードに必要な 8.867MHz ピクセルクロックを生成します。80 列クロックはマスタークロックから直接供給されます。
- バス制御 — CPLD は Z80 のアドレスと制御信号をデコードして、FPGA の内部メモリマップされた領域のチップイネーブル、読み取り、書き込み、アドレス選択信号を生成し、Z80 の非同期バスプロトコルを FPGA が確実にサンプリングできる同期信号に変換します。
- 代替ゲートアレイロジック — v2.0 でマザーボードから取り外された MB14298 と MB14299 ゲートアレイが元々実行していた機能を提供します。
- tranZPUter シリアライザーインターフェイス — マザーボードのビデオ拡張コネクタだけではアクセスできない tranZPUter ボードから転送された信号(A15–A11、ビデオ RDn/WRn、IORQn)を受け取ります。
CPLD/VideoInterface.vhd。Quartus Prime 13.0.1 でビルド。
FPGA は 144 ピン LQFP パッケージの Altera Cyclone III EP3C25E144C8 です。すべてのビデオコントローラーロジックと内部メモリを提供します。主な仕様:
| パラメーター | 値 |
|---|---|
| デバイス | EP3C25E144C8 |
| パッケージ | 144 ピン LQFP |
| ロジック要素 | 25,000 |
| ブロック RAM | 76 KB |
| I/O 電圧 | 3.3V(全バンク) |
| VHDL ソース | FPGA/VideoController.vhd、VideoController_Toplevel.vhd、VideoController_pkg.vhd、functions.vhd |
| ビルドツール | Quartus Prime 13.1 |
FPGA ビットストリームは FPGA の専用シリアルブートピンに接続された EPCS16 シリアル Flash デバイスに格納されます。電源投入時に FPGA は自動的に EPCS16 から設定をロードします。JTAG 経由の直接 FPGA プログラミングは揮発性で電源オフ時に失われます。設定を永続させるには EPCS16 を別途プログラムする必要があります。
FPGA 内部メモリ使用量
Cyclone III 内の 76KB のブロック RAM が重要な制限リソースです。以下のように割り当てられています:
| ブロック | サイズ | 説明 |
|---|---|---|
| ビデオ RAM(VRAM) | 2 KB | 文字表示 — 元のマシンの 0xD000–0xD7FF に相当。CPU 読み書き(通常のメモリバス経由)。 |
| 属性 RAM | 2 KB | 文字ごとの色と CG-ROM 選択 — v1.x の 0xD800–0xDFFF に相当。CPU 読み書き。 |
| キャラクタージェネレーター RAM(CGRAM) | 可変 | プログラマブル CG-ROM イメージ。メモリページレジスター(0xFD ビット 7)で有効化すると CPU で書き込み可能。 |
| グラフィクスフレームバッファ — 赤バンク | 16 KB | ピクセルごとに 1 ビットの赤チャンネル。640×200 ピクセル(80 列)または 320×200(40 列)をカバー。 |
| グラフィクスフレームバッファ — 緑バンク | 16 KB | ピクセルごとに 1 ビットの緑チャンネル。 |
| グラフィクスフレームバッファ — 青バンク | 16 KB | ピクセルごとに 1 ビットの青チャンネル。 |
| キーマップ、パレットテーブル | 残り | キーボードマッピングテーブルと 256 エントリーのパレット RAM。 |
グラフィクスフレームバッファ RAM の合計:3 × 16KB = 48KB。これがブロック RAM の主要な消費者です。640×200 モードでは単一フレームバッファに完全な 48KB が必要で、2 番目のバッファには十分な RAM が残りません。したがってそのモードではダブルバッファリングは利用できません。他のすべてのモードでは残りの容量を 2 番目の(非表示の)フレームバッファに使用し、ティアフリーの表示更新を可能にします。
グラフィクスフレームバッファ
グラフィクスフレームバッファは、ピクセルごとに 1 ビットを保持する 3 つの独立した 16KB バンク(赤、緑、青)で構成されています。ピクセルは各行内で左から右に、行をまたいで上から下に格納され、1 バイトあたり 8 ピクセル(MSB = 最も左のピクセル)です。80 列モードでは解像度は 640×200 ピクセルで、40 列モードでは 320×200 ピクセルです。
CPU アクセス: 3 つのバンクのいずれかを、メモリページレジスター(0xFD)のビット 0 を設定することで Z80 アドレス空間 0xC000–0xFFFF にマッピングできます。マッピングするバンクは読み取りにはグラフィクスモードレジスター(0xF9)のビット 1:0 で、書き込みにはビット 3:2 で選択します。書き込みモードを 11(間接)に設定すると、書き込みが 3 つのバンクすべてを同時に更新し、各バンクの書き込みがそれぞれのカラーライターレジスター(赤は 0xFA、緑は 0xFB、青は 0xFC)でマスクされます。
間接書き込みの例: 赤フィルター = 0x80、緑フィルター = 0x40、青フィルター = 0x20 の場合、0xC000 に任意の非ゼロ値を書き込むと、ピクセル(0,0)が赤、ピクセル(1,0)が緑、ピクセル(2,0)が青に設定されます。書き込まれたデータバイト自体が、保存される前に各フィルターレジスターでマスクされます。
ダブルバッファリング: 640×200 を除くすべてのモードでアクティブです。アクティブな表示はフロントバッファから読み取り、CPU はバックバッファに書き込みます。バッファは GPU または CPU 制御で入れ替わります。640×200 モードでは表示のティアリングを避けるために WAIT ステートジェネレーターを有効にできます。
レジスターマップ
v2.0 Video Module のすべてのレジスターは Z80 I/O 命令(
IN / OUT)でアクセスします。特に記載がない限り、すべてのレジスターは読み書き可能で、読み取りは最後に書き込まれた値を返します。0xD0–0xD7 の範囲のレジスターはビデオモードパラメーターとパレットを制御します。0xF3–0xFD の範囲のレジスターはビデオモード、グラフィクス、GPU、メモリページング、色書き込みを制御します。
| I/O ポート | 名前 | R/W | 説明 |
|---|---|---|---|
| 0xD0 | ビデオモードパラメーターセレクター | W | ポート 0xD1/0xD2 経由で更新するタイミングパラメーター(0–18)を選択します。 |
| 0xD1 | ビデオモードパラメーター低 | W | 0xD0 で選択されたパラメーターの下位バイト。 |
| 0xD2 | ビデオモードパラメーター高 | W | 0xD0 で選択されたパラメーターの上位バイト。 |
| 0xD3 | パレットオフポインター | W | ピクセルオフカラー設定のパレットエントリー番号(0–255)。 |
| 0xD4 | パレットオンポインター | W | ピクセルオンカラー設定のパレットエントリー番号(0–255)。 |
| 0xD5 | パレット赤値 | W | 0xD3 または 0xD4 で現在選択されているパレットエントリーの 5 ビット赤値。 |
| 0xD6 | パレット緑値 | W | 0xD3 または 0xD4 で現在選択されているパレットエントリーの 5 ビット緑値。 |
| 0xD7 | パレット青値 | W | 0xD3 または 0xD4 で現在選択されているパレットエントリーの 5 ビット青値。 |
| 0xF3 | VGA ボーダーカラー | R/W | ビット 2:0 = VGA 出力モードでのボーダーカラー R/G/B。 |
| 0xF5 | アクティブパレット | R/W | アクティブパレットを選択します。0 = デフォルトシステムパレット。1–255 = 固定パレット。 |
| 0xF6 | GPU パラメーター | R/W | GPU コマンドパラメーター用の 128 ビットプッシュ/ポップ FIFO。書き込みでプッシュ、読み取りでポップ。 |
| 0xF7 | GPU コマンド / ステータス | R/W | 書き込み:GPU コマンドバイト。読み取り:ビット 0 = BUSY フラグ(1 = GPU ビジー)。 |
| 0xF8 | 制御レジスター | R/W | マシンモデル、列幅、カラー有効、PCG 有効、VGA モード選択。 |
| 0xF9 | グラフィクスモードレジスター | R/W | GRAM バンク選択、VRAM/GRAM 出力有効、ブレンドオペレーター。 |
| 0xFA | カラーライター赤 | R/W | 間接 GRAM 書き込みに適用される 8 ピクセルの赤チャンネルマスク。 |
| 0xFB | カラーライター緑 | R/W | 間接 GRAM 書き込みに適用される 8 ピクセルの緑チャンネルマスク。 |
| 0xFC | カラーライター青 | R/W | 間接 GRAM 書き込みに適用される 8 ピクセルの青チャンネルマスク。 |
| 0xFD | メモリページ / ステータス | R/W | 書き込みビット 0:GRAM バンクを 0xC000–0xFFFF にマップ。書き込みビット 7:CGROM を 0xD000–0xDFFF にマップ。読み取りビット 5,6:水平/垂直ブランキングステータス。 |
制御レジスターは主要なモードレジスターです。Video Module がエミュレートする Sharp MZ マシンモデル、列幅、カラーが有効かどうか、プログラマブルキャラクタージェネレーターがアクティブかどうか、VGA 出力解像度を選択します。
| ビット | 機能 | 説明 |
|---|---|---|
| 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 |
| 3 | 列幅 | 0 = 40 列。1 = 80 列。 |
| 4 | カラー有効 | 0 = モノクロ出力。1 = カラー出力。 |
| 5 | PCG RAM 有効 | 0 = PCG 無効(ハードウェア CG-ROM を使用)。1 = プログラマブル CG RAM 有効。 |
| 7:6 | VGA モード | 00 = ネイティブ 15.62kHz 水平スキャン。01 = VGA 640×480 @ 60Hz。10 = VGA 1024×768 @ 60Hz。11 = VGA 800×600 @ 60Hz。 |
グラフィクスモードレジスターは、CPU がどの GRAM バンクを読み書きするか、文字表示(VRAM)とグラフィクス表示(GRAM)が出力に寄与するか、2 つのレイヤーをどのようにブレンドするかを制御します。
| ビット | 機能 | 説明 |
|---|---|---|
| 1:0 | 読み取りバンク | 00 = 赤、01 = 緑、10 = 青。CPU 読み取りのために 0xC000–0xFFFF に表示される GRAM バンクを選択します。 |
| 3:2 | 書き込みバンク | 00 = 赤、01 = 緑、10 = 青、11 = 間接(カラーライターレジスターでマスクして 3 つのバンクすべてに同時書き込み)。 |
| 4 | VRAM 出力 | 0 = 文字表示を有効にする。1 = 文字表示を無効にする。 |
| 5 | GRAM 出力 | 0 = グラフィクス表示を有効にする。1 = グラフィクス表示を無効にする。 |
| 7:6 | ブレンドオペレーター | 00 = OR、01 = AND、10 = NAND、11 = XOR。VRAM と GRAM の両方の出力が有効な場合に適用されます。 |
3 つのカラーライターレジスターは、書き込みバンクが間接モード(グラフィクスモードレジスタービット 3:2 = 11)に設定されている場合に GRAM 書き込みに適用される 8 ピクセル幅のビットマスクを提供します。各レジスターは 1 つのカラーチャンネルを制御します。間接モードで GRAM アドレス範囲 0xC000–0xFFFF にバイトが書き込まれると、バイトは赤フィルターと AND されて赤バンクに格納され、緑フィルターと AND されて緑バンクに格納され、青フィルターと AND されて青バンクに格納されます。これにより単一の書き込みでバイト内の個々のピクセルに異なる色を設定できます。
例:赤フィルター(0xFA)= 0xFF、緑フィルター(0xFB)= 0x00、青フィルター(0xFC)= 0x00。0xC000 への 0xFF の間接書き込みは、行 0 のすべての 8 ピクセルを赤に設定し、緑または青の成分はありません。
| レジスター | カラー | ビット 7 | ビット 6 | ビット 5 | ビット 4 | ビット 3 | ビット 2 | ビット 1 | ビット 0 |
|---|---|---|---|---|---|---|---|---|---|
| 0xFA | 赤 | ピクセル 0 | ピクセル 1 | ピクセル 2 | ピクセル 3 | ピクセル 4 | ピクセル 5 | ピクセル 6 | ピクセル 7 |
| 0xFB | 緑 | ピクセル 0 | ピクセル 1 | ピクセル 2 | ピクセル 3 | ピクセル 4 | ピクセル 5 | ピクセル 6 | ピクセル 7 |
| 0xFC | 青 | ピクセル 0 | ピクセル 1 | ピクセル 2 | ピクセル 3 | ピクセル 4 | ピクセル 5 | ピクセル 6 | ピクセル 7 |
ビット 7 は各バイトの最も左のピクセル(ピクセル 0)で、ビット 0 は最も右(ピクセル 7)です。
メモリページ / ステータスレジスター(0xFD)
このレジスターは Video Module 内部メモリへの CPU アクセスを制御し、ディスプレイブランキングステータスを報告します。このレジスターで設定されたメモリマッピングは、MZ-700 や MZ-80B 固有のページレジスターを含む他のすべてのメモリページ設定をオーバーライドします。
| ビット | 方向 | 機能 | 説明 |
|---|---|---|---|
| 0 | R/W | GRAM 有効 | 1 = 選択された 16KB GRAM バンクを 0xC000–0xFFFF にマップ。0 = 通常の Z80 メモリ。 |
| 5 | R | H ブランクステータス | 1 = 水平ブランキング期間がアクティブ。 |
| 6 | R | V ブランクステータス | 1 = 垂直ブランキング期間がアクティブ。 |
| 7 | R/W | CGROM 有効 | 1 = CGROM を CPU アップロードのために 0xD000–0xDFFF にマップ。0 = 通常のメモリ。 |
GPU — グラフィクス処理ユニット
FPGA は Z80 CPU を占有することなく VRAM と GRAM の一括操作を実行できる基本的な GPU を実装しています。GPU を使用するには:
GPU コマンド
- 必要なすべてのパラメーターを GPU パラメーターレジスター(0xF6)に順番にプッシュします。各書き込みで既存の 128 ビット FIFO が 8 ビット左にシフトし、新しいバイトがビット 7:0 に挿入されます。したがってパラメーターは MSB から順に(最も番号の高いパラメータービットから)プッシュされます。
- コマンドバイトを 0xF7 に書き込みます。
- 0xF7 をポーリングします。GPU が実行中はビット 0(BUSY)が 1 になります。次のコマンドを発行する前にビット 0 が 0 になるのを待ちます。
| コマンド | パラメーター(0xF6 に MSB から順にプッシュ) | 説明 |
|---|---|---|
| 0x00 | なし | ノーオペレーション。アイドル状態。このコマンドを発行しても効果はありません。 |
| 0x01 | なし | VRAM 全体をスペース文字(0x00)と青い背景に白い前景の属性でクリアします。 |
| 0x02 | [15:8] = 文字バイト、[7:0] = 属性バイト | 指定した文字と属性値で VRAM 全体をクリアします。 |
| 0x03 | [47:40] = StartX、[39:32] = StartY、[31:24] = EndX、[23:16] = EndY、[15:8] = 文字、[7:0] = 属性 | 指定した文字と属性で VRAM の矩形領域(文字座標)を塗りつぶします。 |
| 0x81 | なし | GRAM 全体をクリア — すべての 3 つ(赤、緑、青)の 16KB フレームバッファのすべてのピクセルをゼロに設定します。 |
| 0x82 | [87:72] = StartX、[71:56] = StartY、[55:40] = EndX、[39:24] = EndY、[23:16] = 赤フィルター、[15:8] = 緑フィルター、[7:0] = 青フィルター | フィルターマスクに従って GRAM の矩形領域(ピクセル座標)を塗りつぶします。各フィルターは 8 ビット幅(ビット 7 = 最も左のピクセル)。1 ビットはピクセルを設定し、0 ビットはクリアします。 |
| 0xFF | なし | GPU をリセット。実行中の操作をキャンセルして即座にアイドル状態に戻ります。 |
コマンド 0x82 の例のパラメータープッシュ順:すべてのピクセルが赤で、緑と青のピクセルがすべてクリアで GRAM ピクセル(0,0)–(639,199)をクリアするには、この順番で 0xF6 にバイトをプッシュします:StartX 高(0x00)、StartX 低(0x00)、StartY 高(0x00)、StartY 低(0x00)、EndX 高(0x02)、EndX 低(0x7F)、EndY 高(0x00)、EndY 低(0xC7)、赤フィルター(0xFF)、緑フィルター(0x00)、青フィルター(0x00)。次に 0xF7 に 0x82 を書き込みます。
ビデオタイミングモード
アクティブなビデオタイミングモードは、制御レジスター(0xF8)のビット 7:6(VGA モード)、ビット 3(列幅)、ビット 2:0(マシンモデル)によって決定されます。モード内の個々のタイミングパラメーターは、ビデオモードパラメーターレジスター(0xD0–0xD2)を使用して実行時にオーバーライドできます。パラメーターセレクター(0xD0)はパラメーター番号 0–18 を取り、値は低(0xD1)と高(0xD2)バイトレジスターに分割された 16 ビット量として書き込まれます。
パラメーターキー:
H_DSP_START パラメーター 0 水平表示エリア開始(物理) H_DSP_END パラメーター 1 水平表示エリア終了 H_DSP_WND_START パラメーター 2 水平表示ウィンドウ開始(データ出力エリア) H_DSP_WND_END パラメーター 3 水平表示ウィンドウ終了 V_DSP_START パラメーター 4 垂直表示エリア開始 V_DSP_END パラメーター 5 垂直表示エリア終了 V_DSP_WND_START パラメーター 6 垂直表示ウィンドウ開始 V_DSP_WND_END パラメーター 7 垂直表示ウィンドウ終了 H_LINE_END パラメーター 8 最後の水平ピクセル(総ライン長 − 1) V_LINE_END パラメーター 9 最後の垂直ライン(総フレーム高さ − 1) MAX_COLUMNS パラメーター 10 最大文字列数(40 または 80) H_SYNC_START パラメーター 11 水平同期パルス開始(= H_DSP_END + フロントポーチ) H_SYNC_END パラメーター 12 水平同期パルス終了 V_SYNC_START パラメーター 13 垂直同期パルス開始 V_SYNC_END パラメーター 14 垂直同期パルス終了 H_POLARITY パラメーター 15 水平同期極性:0 = ネガティブ、1 = ポジティブ V_POLARITY パラメーター 16 垂直同期極性:0 = ネガティブ、1 = ポジティブ H_PX パラメーター 17 水平ピクセル倍増係数(0=1×、1=2×、2=4×) V_PX パラメーター 18 垂直ピクセル倍増係数(0=1×、1=2×、2=4×)
ビルドシステム
v2.0 Video Module には 2 つの異なるハードウェアビルドターゲット(CPLD と FPGA)があり、それぞれ異なるバージョンの Quartus Prime が必要です。両方のバージョンをバンドルし、複雑なネイティブ Altera ツールチェーンのインストールを不要にする Docker イメージが提供されており、推奨されるアプローチです。
CPLD ビルド(Quartus Prime 13.0.1)
CPLD VideoInterface は、Altera MAX 7000A ファミリーをサポートする最後のバージョンである Quartus Prime 13.0.1 でコンパイルされます。ターゲットデバイスは EPM7128S です。
| ファイル | 説明 |
|---|---|
CPLD/VideoInterface.vhd |
メイン VHDL 設計ファイル — すべてのゲートと相互接続ロジック。 |
CPLD/VideoInterface_pkg.vhd |
パッケージファイル — すべてのモジュールで共有される定数、型、関数宣言。 |
CPLD/VideoInterface_TopLevel.vhd |
トップレベルラッパー — ピン I/O 宣言とコンポーネントインスタンス化。 |
CPLD/build/VideoInterface.qpf |
Quartus Prime プロジェクトファイル。これを開いてプロジェクトをロードします。 |
CPLD/build/VideoInterface.qsf |
プロジェクト設定ファイル — ピン割り当て、デバイス選択、コンパイルパラメーター。 |
CPLD/build/VideoInterface_constraints.sdc |
TimeQuest アナライザーの配置ルートガイダンス用タイミング制約。 |
CPLD/build/VideoInterface.csv |
ピン割り当て CSV — Quartus Prime ピンプランナーにインポート可能。 |
コンパイル: 1. Quartus Prime v13.0.1 を起動します。 2. File → Open Project → CPLD/build/VideoInterface.qpf を選択します。 3. Processing → Start Compilation。警告メッセージは無視できます。 4. 出力ビットストリーム:CPLD/build/output_files/VideoInterface.sof プログラミング: 1. Altera USB Blaster を Video Module の 10 ピン JTAG IDC コネクタに接続します。 2. Tools → Programmer → Hardware Setup → USB Blaster を選択 → Close。 3. Auto Detect をクリックします。3 つのデバイスが表示されるはずです:EPM7128S、EP3C25E144、EPCS16。 4. EPM7128S を右クリック → Add File → VideoInterface.sof を選択します。 5. EPM7128S の 'Program/Configure' と 'Verify' を有効にします。 6. Start をクリックします。FPGA ビルド(Quartus Prime 13.1)
FPGA VideoController は Cyclone III EP3C25 デバイスをサポートする Quartus Prime 13.1 でコンパイルされます。FPGA ビットストリームは揮発性です — 電源サイクルをまたいで持続するには、コンパニオンの EPCS16 シリアル Flash に格納する必要があります。
| ファイル | 説明 |
|---|---|
FPGA/VideoController.vhd |
メイン VHDL 設計ファイル — 完全なビデオコントローラーロジック。 |
FPGA/VideoController_pkg.vhd |
パッケージファイル — 定数、型、共有宣言。 |
FPGA/VideoController_Toplevel.vhd |
トップレベルラッパー — FPGA ピン I/O とコンポーネントインスタンス化。 |
FPGA/functions.vhd |
共有ユーティリティ関数。 |
FPGA/build/VideoController.qpf |
Quartus Prime プロジェクトファイル。 |
FPGA/build/VideoController.qsf |
プロジェクト設定 — ピン割り当て、デバイス、コンパイルオプション。 |
FPGA/build/VideoController_constraints.sdc |
タイミング制約。 |
FPGA/build/VideoController.csv |
ピン割り当て CSV。 |
コンパイル: 1. Quartus Prime v13.1 を起動します。 2. File → Open Project → FPGA/build/VideoController.qpf を選択します。 3. Processing → Start Compilation。警告メッセージは無視できます。 4. 出力ビットストリーム:FPGA/build/output_files/VideoController.sof FPGA のプログラミング(揮発性 — 電源オフで失われる): 1. USB Blaster を 10 ピン JTAG コネクタに接続します。 2. Tools → Programmer → Hardware Setup → USB Blaster を選択 → Close。 3. Auto Detect — 3 つのデバイスが表示されるはずです。 4. EP3C25E144 を右クリック → Add File → VideoController.sof を選択します。 5. EP3C25E144 の 'Program/Configure' を有効にします。 6. Start をクリックします。 EPCS16 のプログラミング(永続的 — 電源サイクルをまたいで保存): 1. File → Convert Programming Files。 2. Programming File Type:JTAG Indirect Configuration File(.jic)。 3. Configuration Device:EPCS16。 4. Flash Loader → Add Device → Cyclone III → EP3C25 → OK。 5. SOF Data → Add File → VideoController.sof を選択 → OK。 6. File Name:VideoController.jic の出力パスを設定します。 7. Generate をクリック → Close。 8. Tools → Programmer → Auto Detect。 9. EP3C25E144 に VideoController.sof を追加(Program/Configure)。 10. EPCS16 に VideoController.jic を追加(Program/Configure + Verify)。 11. Start をクリックします。FPGA と EPCS16 の両方がプログラムされました。Docker ビルド環境
Linux への Quartus Prime のネイティブインストールは、パッケージの依存関係の問題から信頼性が低い場合があります。Ubuntu、必要なすべてのパッケージ、Quartus Prime 13.0.1(CPLD 用)と Quartus Prime 13.1(FPGA 用)をバンドルした Docker イメージが提供されています。X11 フォワーディングにより Quartus GUI をホストマシンに表示できます。USB Blaster はイメージにインストールされた udev ルールを通じてホストからコンテナへパスされます。
# Docker ビルドリポジトリをクローン: cd ~ git clone https://git.eaw.app/eaw/zpu.git cd zpu/docker/QuartusPrime # (オプション)ビルド前に Lite から Standard エディションに変更: # Dockerfile.13.0.1 を編集: # コメント解除:ARG QUARTUS=QuartusSetup-13.0.1.232.run # コメントアウト:ARG QUARTUS=QuartusSetupWeb-13.0.1.232.run # (オプション)ライセンスファイルをインストール: # cp <your license> files/license.dat # run.sh を編集して MAC_ADDR をライセンスの MAC アドレスに合わせて設定します。 # Quartus 13.0.1 用 Docker イメージをビルド(CPLD): 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 13.1(FPGA)の場合は Dockerfile.13.1 で繰り返します。 # ホストで X11 フォワーディングを設定: export DISPLAY=<x-server-ip>:0 xhost + # または共有ネットワークでのセキュリティのために xhost <docker-host-ip> # プロジェクトディレクトリマッピングを設定: # run_quartus.sh を編集: # PROJECT_DIR_HOST=<プロジェクトへのホストパス> # PROJECT_DIR_IMAGE=<プロジェクトへのコンテナパス> # コンテナで Quartus を起動: ./run_quartus.sh # コンテナを停止: docker stop quartus
最初の起動時に Quartus Prime はライセンスの入力を求めます。"Run the Quartus Prime software" を選択して OK をクリックします。USB Blaster は、コンテナが起動した後に接続された場合、ホストで udev ルールがアクティブであれば Programmer ツールに自動的に表示されます。
CG-ROM イメージのビルド
32KB キャラクタージェネレーター Flash RAM イメージ(COLOURBOARD_CG.rom)は、16 個の個別の 2KB CG-ROM スロットイメージを順番に連結することで組み立てられます。シェルスクリプト
software/tools/make_cgrom.sh がこの連結を自動的に実行します。出力ファイルは v1.x ボードで使用するために 28C256 Flash RAM に直接書き込んだり、v2.0 では FPGA のメモリ初期化ファイルとしてロードしたりできます。
cd <リポジトリルート>/software ./tools/make_cgrom.sh # 出力:../../MZ80A_80COLOUR/software/roms/COLOURBOARD_CG.rom (32 KB)
参考サイト
| リソース | リンク |
|---|---|
| Video Module プロジェクトページ | /sharpmz-upgrades-videomodule/ |
| tranZPUter プロジェクトページ | /sharpmz-upgrades-tranzputer/ |
| Sharp MZ エミュレーター | /sharpmz-emulator/ |
| RFS テクニカルガイド | /sharpmz-upgrades-rfs-technicalguide/ |
| Nibbles Lab Sharp MZ ミュージアム | http://retropc.net/ohishi/museum/mz1200.htm |
| Altera Quartus Prime(レガシー) | https://www.intel.com/content/www/us/en/collections/products/fpga/software/downloads.html |
| Docker ビルドリポジトリ | https://git.eaw.app/eaw/zpu |