Sharp MZ-80A ビデオモジュール — ユーザーマニュアル
Video Module ユーザーマニュアル
Sharp MZ-80A Video Module は、Sharp MZ-80A のビデオ機能を復元・拡張するハードウェアアップグレードです。MZ-80A は MZ-80B と同一のハードウェアを共有していますが、工場出荷時の配線で 80 列モードとカラー出力が永久に無効化されていました。Video Module はこれを修正し、最大 16 文字セットを格納する切り替え可能な 32KB Flash RAM キャラクタージェネレーター ROM を追加します。また v2.0 の FPGA バージョンでは、完全な VGA 出力、640×200 ピクセルグラフィクス、GPU アクセラレーション、MZ-80K から MZ-2000 までのすべての Sharp MZ ビデオモードのエミュレーションが追加されます。
このマニュアルはハードウェアの選択、物理的なインストール、日常的な使用、v1.1 と v2.0 両方の完全なレジスターリファレンスを対象としています。ソースファイル、回路図 PDF、Quartus プロジェクトファイルはプロジェクトリポジトリから入手できます。
どのバージョンを選べばいいか?
Video Module には 2 つのハードウェア世代があります。適切な選択は、MZ-80A にすでに何が取り付けられているか、必要なビデオ機能のレベルによって異なります。
| 機能 | v1.1(ディスクリート) | v2.0(FPGA) |
|---|---|---|
| 40 / 80 列切り替え | あり | あり |
| 8 色 RGB 出力 | あり | あり |
| コンポジットビデオ出力 | あり | なし |
| VGA 出力(640×480 / 800×600 / 1024×768) | なし | あり |
| 16 スロットキャラクタージェネレーター ROM | あり | あり |
| 640×200 / 320×200 ピクセルグラフィクス | なし | あり |
| GPU アクセラレーション | なし | あり |
| Sharp MZ ビデオモードエミュレーション | なし | あり(MZ-80K/80C/1200/80A/700/800/80B/2000) |
| プログラマブルカラーパレット | なし | あり |
| tranZPUter ボードが必要 | なし | あり |
| ディスクリート 74 シリーズ IC | あり | なし |
v1.1 を選ぶ場合:他のアップグレードボードなしで標準的な MZ-80A にスタンドアローンのディスクリートコンポーネントアップグレードを希望する場合。他のアップグレードボードへの依存なしに 40/80 列切り替えと 8 色 RGB 出力を提供します。
v2.0 を選ぶ場合:tranZPUter ボードがすでに MZ-80A に取り付けられており、VGA 出力、ピクセルグラフィクス、完全なビデオモードエミュレーションを希望する場合。v2.0 ボードは tranZPUter 拡張コネクタに接続し、tranZPUter なしでは取り付けできません。
v1.0 に関する注記: v1.0 は 5 つの既知のハードウェア欠陥を持つプロトタイプ版です。一般使用には推奨されません。v1.0 ボードをお持ちの場合は、既知のエラータについてトラブルシューティングセクションを参照し、v1.1 の交換品についてはプロジェクトページにお問い合わせください。
必要なもの
v1.1 — ディスクリートコンポーネントバージョン- Video Module v1.1 PCB — 完成品またはセルフビルドキットとして入手可能。完成品には 74 シリーズ IC とレイザーピンアレイがあらかじめ取り付けられています。
- Sharp MZ-80A — どのリビジョンでも可。MZ-80B は電気的に同一で互換性があります。
COLOURBOARD_CG.romがあらかじめプログラムされた 28C256(32KB)Flash RAM — これは 16 個のあらかじめビルドされた文字セットを含むキャラクタージェネレーター ROM イメージです。プロジェクトページからプログラム済みで入手可能、または TL866 II+ 以上互換プログラマーで空の 28C256 を自分でプログラムできます。- RGB(SCART または R/G/B 個別)またはコンポジットビデオ入力を持つカラーモニター。Philips CM8833 などの時代に合ったモニターが適していますが、SCART アダプターを使用した最新のモニターも動作します。
- MZ-80A マザーボードの IC8、IC9、IC15 用の DIP ソケット(キットに付属)。
- チップ引き抜き工具 / IC エクストラクター、精密はんだごて、はんだ。
- 静電気防止策 — ESD リストストラップとマット。
- マザーボードのビデオ拡張コネクタ用の 34 ピンリボンケーブル(ボードに付属)。
- Video Module v2.0 PCB — FPGA ボード、完成品またはキットとして入手可能。
- tranZPUter ボードがすでに取り付けられた Sharp MZ-80A。 Video Module v2.0 は tranZPUter 拡張コネクタに接続し、tranZPUter なしでは使用できません。
- VGA モニター — 標準的な VGA モニター。FPGA は 640×480@60Hz、800×600@60Hz、または 1024×768@60Hz で出力できます。
- Altera USB-Blaster(または互換クローン)JTAG プログラマー — 最初のインストール時とファームウェアアップデート後に CPLD と FPGA をプログラムするために必要。
- Quartus Prime 13.0.1 — CPLD(
VideoInterface.jic)をプログラムするために必要。Intel/Altera から無料ダウンロード。 - Quartus Prime 13.1 — FPGA(
VideoController.jic)をプログラムするために必要。Intel/Altera から無料ダウンロード。 - 静電気防止策 — ESD リストストラップとマット。
Video Module v1.1 のインストール
v1.1 ボードは、MZ-80A マザーボードの IC8、IC9、IC15 の上に乗る娘基板です。これらの IC を取り外し DIP ソケットに置き換えます。娘基板のレイザーピンアレイがソケットに差し込まれ、Video Module ロジックを介してシグナルを再エクスポートします。34 ピンリボンケーブルでボードとマザーボードのビデオ拡張コネクタを接続します。以下の手順はインストールの概要です — 写真と正確なコンポーネントの位置については、プロジェクトドキュメントの 35 ステップの図解ガイドを参照してください。
インストール手順
- MZ-80A の電源を切って電源ケーブルを抜きます。外側のケースカバーを取り外し、脇に置きます。
- シャーシにクリップした ESD リストストラップでアースします。
- MZ-80A マザーボード上の IC8、IC9、IC15 の位置を確認します。IC15 は 2KB のキャラクタージェネレーター ROM です。IC8 と IC9 はビデオゲートアレイ IC です。不確かな場合は MZ-80A サービスマニュアルのマザーボードオーバーレイ図を参照してください。
- チップ引き抜き工具を使用して IC8、IC9、IC15 を慎重に取り外します。ピンが曲がらないよう角から角へ作業します。取り外した IC は静電気防止バッグに保管します — 再取り付けはしません。娘基板がその機能を引き継ぎます。
- IC8、IC9、IC15 のフットプリントに DIP ソケットを取り付けます。各ピンを慎重にはんだ付けします。次に進む前にはんだブリッジがないか確認します。
- ボードの裏面にあるレイザーピンアレイを使用して、3 つの DIP ソケットに Video Module 娘基板を取り付けます。ボードは水平になるはずです。レイザーピンがソケットに完全に係合するまでしっかり押し込みます。
- 娘基板の J1 コネクタと MZ-80A マザーボードのビデオ拡張コネクタの間に 34 ピンリボンケーブルを接続します。ピン 1 のアライメント(リボンの赤いストライプが両方のコネクタのピン 1 マーカーに合う)を確認します。
- 娘基板のソケット U10 にあらかじめプログラムされた 28C256 Flash RAM(CG-ROM)を取り付けます。ノッチをソケットに合わせてしっかり押し込みます。このデバイスは元の 2KB キャラクタージェネレーター ROM を置き換え、完全な 16 スロット文字セットイメージを保持します。
- ケースの背面の便利な場所に RGB / コンポジット出力コネクタを配線します。コネクタカットアウトのあるブランクプレートはプロジェクトページから入手可能、または既存の未使用のケース背面パネルの開口部を使用できます。
- MZ-80A ケースを組み立て直し、出力コネクタにカラーモニターを接続します。
- 電源を入れてテストします — MZ-80A は正常に起動するはずです。ディスプレイは 40 列モードで白い文字が黒い背景のカラーモニターに表示されるはずです(デフォルトの属性状態)。80 列モードへの切り替えと文字の色設定については モジュールの使い方 — v1.x に進んでください。
空の 28C256 を自分でプログラムする必要がある場合、TL866 II+ 以上互換プログラマーを
minipro ユーティリティとともに使用します。イメージファイルはプロジェクトリポジトリの releases/ ディレクトリにある COLOURBOARD_CG.rom です:
minipro --infoic /path/to/minipro/infoic.xml -p AT28C256 -s -w COLOURBOARD_CG.rom
プログラム後に検証します:
minipro --infoic /path/to/minipro/infoic.xml -p AT28C256 -s -y COLOURBOARD_CG.rom
Video Module v2.0 のインストール
v2.0 ボードは MZ-80A 内部の tranZPUter 拡張コネクタに接続する FPGA ベースの設計です。v2.0 Video Module を取り付ける前に、tranZPUter ボードがすでに取り付けられ正常に動作していることを確認してください。ボード上の FPGA と CPLD は初回使用前に JTAG 経由でプログラムする必要があります。以下の手順はインストールの概要です — 写真と正確なコネクタの位置については、プロジェクトドキュメントの 35 ステップの図解ガイドを参照してください。
インストール手順
- tranZPUter ボードの確認 — MZ-80A が取り付けられた状態で正常に起動することを確認します。Video Module v2.0 は tranZPUter のバスインターフェイスと電源レールに依存します。
- MZ-80A の電源を切って電源ケーブルを抜きます。ESD リストストラップでアースします。
- Video Module v2.0 ボードを tranZPUter 拡張コネクタに接続します。ボードのエッジコネクタを tranZPUter 拡張ヘッダーに合わせます — 圧力を加える前にピン 1 のアライメントを確認します。
- Video Module ボードの JTAG ヘッダーに USB-Blaster JTAG プログラマーを接続します。まだ MZ-80A の電源を入れないでください。
- ボードの JTAG ターゲットに電源が供給されるよう MZ-80A の電源を入れます。
- Quartus Prime 13.0.1 を使用して CPLD をプログラムします。Quartus プログラマーを開き、
VideoInterface.jicファイルを選択し、JTAG チェーンの CPLD デバイスを選択して、スタートをクリックします。プログラムが正常に完了するのを待ちます。 - Quartus Prime 13.1 を使用して FPGA をプログラムします。Quartus プログラマーを開き、
VideoController.jicファイルを選択し、JTAG チェーンの FPGA デバイスを選択して、スタートをクリックします。プログラムが正常に完了するのを待ちます。 - JTAG プログラマーを切断し、Video Module ボードの VGA 出力コネクタに VGA モニターを接続します。
- MZ-80A の電源を入れ直します。システムは起動し、デフォルトの解像度(640×480@60Hz)で VGA モニターにビデオを出力するはずです。ビデオモードの設定とピクセルグラフィクスの有効化については モジュールの使い方 — v2.0 に進んでください。
ファームウェアアップデート: 更新された
.jic ファイルがリリースされたら、手順 4〜8 を繰り返して CPLD と FPGA を再プログラムします。初期インストール時にケーブルが配線されていれば、MZ-80A を分解しなくてもファームウェアを更新できます — JTAG ヘッダーはケースの外からアクセスできます。
モジュールの使い方 — v1.x
40 / 80 列切り替え
列モードはメモリアドレス
0xDFFF の制御ラッチに書き込むことで制御されます。ビット 7 が列幅を選択します:
| ビット 7 | モード |
|---|---|
| 0 | 40 列(電源投入後のデフォルト) |
| 1 | 80 列 |
v1.0(プロトタイプ):
0xDFFF への直接バイト書き込みで十分です。
v1.1(現行版): ボード上のマルチバイブレーターが誤った書き込みから保護します。ラッチは、単一の命令サイクル内で読み取りが書き込みの直前に来た場合にのみ新しい値を受け付けます。次のリード-モディファイ-ライトシーケンスを使用してください:
; 80 列モードに切り替え(v1.1) LD HL, 0xDFFF LD B, 0x80 ; ビット 7 = 1 が 80 列 LD A, (HL) ; 読み取り — マルチバイブレーターウィンドウをトリガー LD (HL), B ; ウィンドウ内で書き込み ; 40 列モードに切り替え(v1.1) LD HL, 0xDFFF LD B, 0x00 ; ビット 7 = 0 が 40 列 LD A, (HL) ; 読み取り — マルチバイブレーターウィンドウをトリガー LD (HL), B ; ウィンドウ内で書き込み
ラッチバイトのビット 1:0 はどのグループの 4 文字セットがアクティブかを選択します(キャラクター ROM 選択を参照)。列モードを切り替える際は、現在のラッチ値を読み取ってビット 7 のみを OR または AND することで、これらのビットを常に保持してください:
; 現在の CG-ROM グループビットを保持しながら 80 列に切り替え LD HL, 0xDFFF LD A, (HL) ; 現在の値を読み取り(ウィンドウもトリガー) OR 0x80 ; ビット 7 のみ設定 LD (HL), A ; ウィンドウ内で書き込みカラー出力
MZ-80A のビデオハードウェアは、アドレス
0xD800–0xDFFF(制御ラッチ 0xDFFF 自体を除く)に並列属性 RAM を保持しています。属性 RAM の各バイトは、0xD000–0xD7FF のキャラクター RAM バイトと同じスクリーン位置に対応します。属性バイトは前景色、背景色、キャラクター ROM サブセレクションをエンコードします:
| ビット | 機能 |
|---|---|
| 2:0 | 背景色(ビット 2 = 緑、ビット 1 = 赤、ビット 0 = 青) |
| 3 | キャラクター ROM セレクタービット 0(アクティブグループ内のサブセレクション) |
| 6:4 | 前景色(ビット 6 = 緑、ビット 5 = 赤、ビット 4 = 青) |
| 7 | キャラクター ROM セレクタービット 1 |
カラー値は 3 つの RGB ビットを組み合わせて作ります。8 つの可能な色は:
| RGB ビット | 色 |
|---|---|
| 000 | 黒 |
| 001 | 青 |
| 010 | 赤 |
| 011 | マゼンタ |
| 100 | 緑 |
| 101 | シアン |
| 110 | 黄 |
| 111 | 白 |
例: スクリーン位置(列 0、行 0)に文字 'A' を黒い背景に青で表示する:
; キャラクター RAM と属性 RAM はどちらも位置(0,0)のオフセット 0 から始まる LD HL, 0xD000 LD (HL), 0x41 ; ASCII 'A' をキャラクター RAM に LD HL, 0xD800 LD (HL), 0x10 ; 前景 = 青(ビット 4 がセット)、背景 = 黒(ビット 2:0 = 000)
例: 青い背景に白い文字:
; 属性バイト:前景白 = 0x70(ビット 6:4 = 111)、背景青 = 0x01(ビット 2:0 = 001) ; 合計:0x71 LD A, 0x71 LD (0xD800), A
40 列表示(40×25 = 1000 文字位置)で単一の属性値(例えば黒背景に白、0x70)でスクリーン全体を塗りつぶすには:
LD HL, 0xD800 LD BC, 0x03E8 ; 1000 = 40 列 × 25 行 LD A, 0x70 ; 白の前景、黒の背景 FILL_LOOP: LD (HL), A INC HL DEC BC LD A, B OR C JR NZ, FILL_LOOPキャラクター ROM 選択
U10 に取り付けられた 32KB Flash RAM は最大 16 文字セット(各 2KB)を保持します。各スクリーン位置のアクティブな文字セットは 2 つのビットソースを組み合わせることで選択されます:
0xDFFFの制御ラッチのビット 1:0 — ディスプレイ全体でどのグループの 4 文字セット(0–3)がアクティブかを選択します。- 対応する属性 RAM アドレスの属性バイトのビット 7 と 3 — その個々の文字位置でアクティブグループ内の 4 文字セットのどれを使用するかをサブセレクションします。
COLOURBOARD_CG.rom イメージはスロットを以下のように配置します:
| スロット | ラッチビット 1:0 | 属性ビット 7、3 | ROM イメージ | 説明 |
|---|---|---|---|---|
| 0 | 00 | 0, 0 | mz-80acg | MZ-80A ヨーロッパ文字セット |
| 1 | 00 | 0, 1 | MZ80K_cgrom | MZ-80K ヨーロッパ文字セット |
| 2 | 00 | 1, 0 | MZ80K2E_Jap | MZ-80K 日本語文字セット |
| 3 | 00 | 1, 1 | MZFONT | 代替フォント |
| 4 | 01 | 0, 0 | MZ700_cgrom(バンク 0) | MZ-700 ヨーロッパ(最初の 2KB バンク) |
| 5 | 01 | 0, 1 | MZ700_cgrom(バンク 1) | MZ-700 ヨーロッパ(2 番目の 2KB バンク) |
| 6 | 01 | 1, 0 | MZ700_cgrom_jp(バンク 0) | MZ-700 日本語(最初の 2KB バンク) |
| 7 | 01 | 1, 1 | MZ700_cgrom_jp(バンク 1) | MZ-700 日本語(2 番目の 2KB バンク) |
| 8 | 10 | 0, 0 | mz-80acg | MZ-80A ヨーロッパ文字セット |
| 9 | 10 | 0, 1 | MZ80B | MZ-80B ヨーロッパ文字セット |
| 10 | 10 | 1, 0 | mz-80acg | MZ-80A ヨーロッパ(フィラー) |
| 11 | 10 | 1, 1 | mz-80acg | MZ-80A ヨーロッパ(フィラー) |
| 12 | 11 | 0, 0 | mz-80acg | MZ-80A ヨーロッパ(フィラー) |
| 13 | 11 | 0, 1 | mz-80acg | MZ-80A ヨーロッパ(フィラー) |
| 14 | 11 | 1, 0 | mz-80acg | MZ-80A ヨーロッパ(フィラー) |
| 15 | 11 | 1, 1 | mz-80acg | MZ-80A ヨーロッパ(フィラー) |
例: すべての文字位置に MZ-80K ヨーロッパ文字セット(スロット 1)を選択する。ラッチビット 1:0 を 00 に設定し、ビット 3 がセットされビット 7 がクリアの属性バイト(値 0x08 を色ビットと OR したもの)を書き込みます:
; ラッチ設定:80 列、CG グループ 0(ビット 1:0 = 00) LD HL, 0xDFFF LD A, (HL) AND 0xFC ; ビット 1:0 をクリア OR 0x80 ; 80 列ビットを保持 LD (HL), A ; MZ-80K ヨーロッパセット、黒背景に白の属性 ; 属性ビット 3 = 1、ビット 7 = 0、前景白(ビット 6:4 = 111)= 0x78 LD A, 0x78 LD (0xD800), A ; 最初の文字位置に適用
同じ 2KB スロットレイアウトを使用して修正されたイメージで 28C256 Flash RAM をプログラムすることで、カスタム文字セットを 16 スロットのいずれかにロードできます。ROM イメージビルドスクリプトについてはプロジェクトリポジトリを参照してください。
モジュールの使い方 — v2.0
v2.0 の FPGA ベースの Video Module は、Z80 I/O ポート書き込みを通じて完全に制御されます。すべての v1.x 機能(40/80 列切り替え、カラー属性、CG-ROM 選択)は新しいレジスターインターフェイスを通じて利用可能で、
制御レジスター(I/O ポート 0xF8)
0xDFFF の元のメモリマップドラッチは v1.x ソフトウェアとの後方互換性のために引き続き動作します。
主要な制御レジスターは Z80 の
OUT (0xF8), A / IN A, (0xF8) でアクセスします。エミュレートするマシンモデル、列幅、カラーモード、PCG RAM アクセス、VGA 出力解像度を設定します:
| ビット | 機能 |
|---|---|
| 2:0 | マシンモードエミュレーション |
| 3 | 列幅:0 = 40 列、1 = 80 列 |
| 4 | カラーモード:0 = モノクロ、1 = カラー |
| 5 | PCG RAM 有効:0 = 無効、1 = 有効 |
| 7:6 | 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 |
VGA 出力モード値(ビット 7:6):
| 値 | モード |
|---|---|
| 00 | ネイティブ — 15.62kHz 水平、60Hz 垂直(オリジナル MZ-80A ビデオタイミング) |
| 01 | 640×480 @ 60Hz VGA |
| 10 | 1024×768 @ 60Hz VGA |
| 11 | 800×600 @ 60Hz VGA |
例: 640×480 VGA 出力で 80 列カラー MZ-80A モードに設定:
; ビット:VGA=01 (640x480)、PCG=0、カラー=1、80列=1、モデル=011 (MZ-80A) ; bits 7:6 = 01 (640x480) = 0x40 ; bit 5 = 0 (PCG オフ) = 0x00 ; bit 4 = 1 (カラー) = 0x10 ; bit 3 = 1 (80 列) = 0x08 ; bits 2:0 = 011 (MZ-80A) = 0x03 ; 合計:0x40 | 0x10 | 0x08 | 0x03 = 0x5B LD A, 0x5B OUT (0xF8), A
例: 800×600 VGA 出力、80 列、モノクロで MZ-80B エミュレーションに切り替え:
; bits 7:6 = 11 (800x600) = 0xC0 ; bit 4 = 0 (モノ) ; bit 3 = 1 (80 列) = 0x08 ; bits 2:0 = 110 (MZ-80B) = 0x06 ; 合計:0xC0 | 0x08 | 0x06 = 0xCE LD A, 0xCE OUT (0xF8), AVGA 出力モード
FPGA は MZ-80A のネイティブ 40 列または 80 列テキスト表示を選択した VGA 解像度にスケールします。3 つの VGA モードはすべて、アクティブな表示エリアを埋めるようにスケールされた MZ-80A 文字マトリックスで正しくセンタリングされたイメージを生成します。ネイティブタイミングモードはオリジナルの 15.62kHz ビデオ信号を出力し、時代に合ったモニター向けです。ほとんどの最新のモニターはこの信号に同期しません。
VGA ボーダーカラー(アクティブな文字マトリックスの外側のエリア)はボーダーレジスターを使用して独立して設定できます:
; VGA ボーダーカラーを設定 — I/O ポート 0xF3 ; ビット 2:0 = ボーダー RGB カラー(属性カラービットと同じエンコーディング) ; 例:青いボーダー(RGB = 001) LD A, 0x01 OUT (0xF3), A ; 例:黒いボーダー LD A, 0x00 OUT (0xF3), Aグラフィクスモード(I/O ポート 0xF9)
v2.0 Video Module には、8 色出力で 640×200 または 320×200 の解像度を提供するピクセルグラフィクスフレームバッファが含まれています。I/O ポート
0xF9 のグラフィクスモードレジスターは、グラフィクス RAM アクセス、解像度、グラフィクスレイヤーをテキスト表示にどのように合成するかを制御します:
| ビット | 機能 |
|---|---|
| 1:0 | グラフィクス RAM バンク選択(CPU アクセスのためにマップされるグラフィクス RAM の 16KB バンクを選択) |
| 2 | グラフィクス表示有効:0 = テキストのみ、1 = グラフィクスレイヤーが表示 |
| 3 | グラフィクス解像度:0 = 640×200(8 色)、1 = 320×200(8 色) |
| 4 | ブレンドモード:0 = グラフィクスがテキストをオーバーレイ(カラー 000/黒のグラフィクスピクセルは透明)、1 = グラフィクスのみ(テキストを非表示) |
| 5 | グラフィクス RAM ライトスルー:0 = CPU がグラフィクス RAM バンクを読み書き、1 = CPU が表示バンクとシャドウバンクの両方に書き込み |
ピクセルフレームバッファは、制御レジスター(ポート 0xF8、ビット 5)の PCG RAM 有効ビットが設定されている場合、CPU アドレス空間の
0xC000–0xFFFF(16KB)にマップされます。グラフィクスモードレジスターのビット 1:0 を使用して露出するバンクを選択します。3 ビット/ピクセルで 640×200 では、完全なフレームバッファには 3 つの 16KB バンクが必要です。
例: テキスト表示の上に 640×200 グラフィクスオーバーレイを有効にする:
; まず制御レジスターで PCG RAM アクセスを有効にする IN A, (0xF8) OR 0x20 ; ビット 5 を設定(PCG RAM 有効) OUT (0xF8), A ; グラフィクスモードを設定:バンク 0、表示有効、640x200、オーバーレイブレンド ; bits 1:0 = 00(バンク 0)、bit 2 = 1(表示オン)、bit 3 = 0(640x200)、bit 4 = 0(オーバーレイ) LD A, 0x04 OUT (0xF9), A ; グラフィクス RAM が 0xC000-0xFFFF でアクセス可能になった ; ピクセルデータを書き込む...GPU アクセラレーション(I/O ポート 0xF6 / 0xF7)
FPGA には、CPU が個別にピクセルを書き込むよりも速くグラフィクス操作(フィル、ブロックコピー、線描画)を実行できるシンプルな GPU が含まれています。コマンドはポート
0xF6 にパラメーターを書き込み、ポート 0xF7 にコマンドオペコードを書き込むことで発行されます。GPU が終了したかどうかを確認するにはポート 0xF7 のビジービット(ビット 7)をポーリングします。
一般的なコマンドシーケンスは次のとおりです:
; 1. GPU がアイドル状態になるのを待つ GPU_WAIT: IN A, (0xF7) BIT 7, A JR NZ, GPU_WAIT ; ビジー中はスピン(ビット 7 = 1) ; 2. パラメーターをポート 0xF6 に書き込む(パラメーター形式はコマンド固有) ; 例:X 座標の下位バイトを書き込む LD A, 0x00 OUT (0xF6), A ; 例:X 座標の上位バイトを書き込む LD A, 0x00 OUT (0xF6), A ; (必要なすべてのパラメーターを書き続ける...) ; 3. ポート 0xF7 にコマンドオペコードを発行する LD A, CMD_FILL ; CMD_FILL を適切なオペコードに置き換える OUT (0xF7), A ; 4. オプションで結果を利用する前に完了を待つ GPU_DONE: IN A, (0xF7) BIT 7, A JR NZ, GPU_DONE
完全な GPU コマンドオペコード、パラメーターシーケンス、実例は、
docs/ の下にあるプロジェクトリポジトリの Video Module テクニカルリファレンスに記載されています。
トラブルシューティング
Video Module 取り付け後に MZ-80A が起動しない
- レイザーピンが完全に固定されていない — 電源を切り、娘基板を 3 つの DIP ソケット全てにしっかり押し込みます。ピンが曲がっていたりソケットの穴を逃していたりしないか確認します。
- DIP ソケットのはんだブリッジ — マザーボードソケットのはんだ接合部を拡大鏡で確認します。IC8、IC9、または IC15 ソケットの隣接するピン間のブリッジがバスコンフリクトを引き起こします。
- リボンケーブルが逆向き — 34 ピンリボンケーブルのピン 1(赤いストライプ)が娘基板とマザーボードのビデオ拡張コネクタの両方のピン 1 マーカーに合っている必要があります。ケーブルを逆向きにするとビデオバスに誤った信号が送られます。
- CG-ROM が挿入されていない — 28C256 Flash RAM は U10 に取り付けられている必要があります。なければキャラクタージェネレーターの出力は未定義になり、ディスプレイはランダムなノイズとして表示されるか同期に失敗します。
- CG-ROM が誤ってプログラムされている — インストール前にプログラマーの検証機能を使用して Flash RAM に
COLOURBOARD_CG.romが含まれていることを確認します。
MZ-80A は起動するがカラーモニターにイメージが表示されない
- 間違ったモニター入力が選択されている — モニターの入力が使用している出力コネクタに合った RGB またはコンポジットに設定されていることを確認します。
- 出力コネクタが正しく配線されていない — RGB / コンポジット出力コネクタが娘基板の J2 にしっかり接続されており、外部コネクタが正しく配線されていることを確認します。
- モニターが 15.62kHz の水平同期をサポートしていない — v1.1 ボードは MZ-80A のネイティブビデオタイミングを出力します。多くの最新のモニターは 15.62kHz に同期しません。時代に合ったモニター、SCART 付きの CRT、またはスキャンダブラー/アップスケーラーを使用してください。
80 列モードがアクティブにならない(v1.1)
- リード-モディファイ-ライトシーケンスなしに直接書き込みを使用している — v1.1 では書き込みの直前に
0xDFFFからの読み取りが必要です。先行する読み取りなしの直接LD (0xDFFF), Aはマルチバイブレーター保護回路によって拒否されます。40 / 80 列切り替えに示されているシーケンスを使用してください。 - v1.0 ボード — これが v1.0 プロトタイプボードの場合、マルチバイブレーター保護がなく直接書き込みで動作するはずです。動作しない場合、ボードに 5 つの既知の v1.0 ハードウェア欠陥のいずれかがある可能性があります。プロジェクトページにお問い合わせください。
- 書き込みシーケンス中に割り込みが有効 — アクティブな割り込みを持つシステムでは、割り込みサービスルーティンが読み取りと書き込みの間に実行され、マルチバイブレーターウィンドウが崩壊する可能性があります。リード-ライトペアの周囲で割り込みを無効(
DI)にして、その後再び有効(EI)にしてください。
色が正しくないか文字が間違った文字セットで表示される
- 属性 RAM が初期化されていない — 電源投入後、属性 RAM の内容は未定義です。コンテンツを表示する前に属性 RAM を目的のデフォルト値(通常は MZ-80A 文字セットを使用した黒背景に白の 0x70)に初期化してください。
- 属性バイトの CG-ROM セレクタービットが期待通りでない — 各属性バイトのビット 7 と 3 は色だけでなく文字セット選択にも寄与します。Video Module を使用しないプログラムがビット 7 と 3 を無視して属性バイトを書き込む可能性があり、予期しない文字セット選択を引き起こします。属性の書き込みでこれらのビットを明示的にマスクしてください。
- ラッチビット 1:0 が正しく設定されていない — 間違った CG グループがアクティブな場合、すべての文字位置が属性ビットに関わらず予期しないグループの 4 文字セットから描画します。ラッチ値を読み取り、ビット 1:0 が意図したグループと一致していることを確認します。
v2.0 ボードから VGA 出力がない
- CPLD または FPGA がプログラムされていない — ボードが出力を生成するには両方のデバイスが JTAG 経由でプログラムされている必要があります。いずれかのプログラミングステップが失敗したかスキップされた場合は、Video Module v2.0 のインストールからプログラミング手順を繰り返してください。
- tranZPUter が正しくインターフェイスしていない — Video Module のトラブルシューティングの前に、tranZPUter ボードが単独で正常に機能していることを確認します。tranZPUter だけで MZ-80A が起動しない場合は、まずそれを解決してください。
- VGA モードがネイティブタイミングに設定されている — ポート 0xF8 のビット 7:6 を 00 に設定するとネイティブ 15.62kHz 出力が選択され、ほとんどの VGA モニターは表示しません。標準の VGA モードを選択するにはビット 7:6 = 01(640×480)を書き込みます。
- 間違った Quartus バージョンが使用されている — CPLD と FPGA では異なる Quartus Prime バージョンが必要です。13.1 を使用して CPLD をプログラム(13.0.1 が必要)したりその逆をしたりすると、有効に見えるが機能しないビットストリームが生成される可能性があります。各デバイスに正しいバージョンを使用してください。
既知の v1.0 プロトタイプエラータ
v1.0 プロトタイプボードには、v1.1 で修正された 5 つの文書化されたハードウェア欠陥があります。v1.0 ボードは一般使用には推奨されません。v1.0 ボードをお持ちの場合は、特定のエラータの詳細と v1.1 交換 PCB の入手情報についてプロジェクトページにお問い合わせください。
参考サイト
| リソース | リンク |
|---|---|
| Video Module プロジェクトページ | /sharpmz-upgrades-videomodule/ |
| Video Module テクニカルリファレンス | リポジトリの docs/ ディレクトリにあります |
| tranZPUter プロジェクトページ | /sharpmz-upgrades-tranzputer/ |
| RFS ユーザーマニュアル | /sharpmz-upgrades-rfs-usermanual/ |
| Sharp MZ-80A サービスマニュアル | archive.org と Sharp ドキュメントアーカイブから入手可能 |
| Quartus Prime 13.0.1(CPLD) | Intel FPGA ダウンロードセンター |
| Quartus Prime 13.1(FPGA) | Intel FPGA ダウンロードセンター |
| minipro プログラマーユーティリティ | https://gitlab.com/DavidGriffith/minipro |