Sharp MZ-80A ビデオモジュール
概要
しかし、MZ80A のハードウェアを調査すると、より高価なビジネスマシンである MZ80B と同一であることが判明しました。MZ80A のハードウェアはマーケティング上の理由から意図的に機能が制限されるよう配線されていたため、配線を変更することで比較的容易に 80 カラム表示を実現できます。
v1 のアップグレードは、配線変更と若干の調整により、MZ-80B の回路を活用して MZ-80A で切り替え可能な 40/80 カラム表示を実現します。
また、モニター ROM とハードウェアの調査から、MZ80A は Sharp MZ700 と同様のカラー出力ボードアップグレードが予定されていたものの、商業的に販売されなかったことが判明しました。 実際、私のオリジナルの 1982 年 MZ-80A ユーザーマニュアル(非常に希少とされている)には、Sharp が製造を予定していたカラー回路の詳細が記載されています。
Nibbles Lab(優れた Sharp ミュージアムおよび情報リポジトリ - Google Chrome の自動翻訳機能をご利用ください)がこれを発見し、MZ80A をカラーモニターに映像出力できるようアップグレードする回路を設計しました。このベース回路にいくつかの変更(コンポジットビデオ)を加え、v1 のアップグレードに組み込みました。
ビデオゲートアレイとビデオシフトレジスタ間の配線を変更するために、これらの IC をドーターカードに持ち上げる設計が必要でした。この時点で、最新のフラッシュ RAM を利用してキャラクタージェネレーター ROM をアップグレードし、複数のキャラクター ROM(MZ80A、MZ700 I/II、日本語 MZ80K ROM など)の保存と切り替えを可能にできることに気付きました。16 種類のキャラクタージェネレーター ROM セットを格納できる 32KB フラッシュ RAM を採用し、アトリビュート RAM(4 つのブロックのうち 1 ブロックに 4 ROM)とコントロールレジスタを介して切り替えが可能です。
私のプロジェクトの目標の一つは、Sharp MZ ハードウェアエミュレーターと実機をできる限り融合させ、実機の機能を拡張し、エミュレーターの改善に実機からのフィードバックを提供することです。これが FPGA 技術(エミュレーターと同じ技術)に基づくビデオモジュール v2 の開発を始めた理由です。
注意事項として、バージョン 2 ではハードウェアがアップグレードされていますが、対応ソフトウェアは多くないかもしれません。例えば MZ-80B SB-5510 BASIC を動作させてピクセルグラフィックスを使用できるようにする作業にまだ多くの時間を費やしていません。エミュレーターでは動作しますが、実機では非ネイティブソフトウェアの実行や追加アップグレードの活用にさらなる調整が必要かもしれません。
ビデオモジュール バージョン 1.0
- KiCad フットプリントエディタが(おそらく私のミスで)2 つの VLSI ゲートアレイのフットプリントを入れ替えてしまいました。修正には精密なはんだ付けと再配線が必要でした。
- オシレーターがクリーンな信号を出力していなかったため、U14B のピン 4 とグランド間に 100pF のセラミックコンデンサを追加して修正しました。これは上記の再配線が一因である可能性があります。
- ゲートアレイの G 信号が回路図では接続されているにもかかわらず、2 つのゲートアレイ間で接続されていませんでした。PCB の断線と思われます。
- アトリビュート RAM / コントロールラッチの競合 - コントロールラッチへの書き込みがアトリビュート RAM の上位ミラーロケーションを更新してしまいます。
- ゲートアレイのライザーピンとマザーボードソケットの物理的な位置合わせがずれており、取り付けが困難でピンに応力がかかっていました。
最近バージョン 1.0 の設計を再検討し、元の問題を解決した v1.1 を作成しました。詳細は以下をご覧ください。
v1.0 カラー回路図

カラー生成回路に加えて、マザーボード上の IC15(キャラクタージェネレーター ROM)を取り外し、IC U10(32KB フラッシュ RAM)に置き換えます。IC U7 のビデオアトリビュート出力ストリームからのビット 7 と 3 を、ラッチ IC U9 と組み合わせて使用し、キャラクタージェネレーター ROM セットを選択できます。ラッチ IC U9 は 32KB フラッシュ RAM 内の 16 のキャラクタージェネレーターセットから 4 つのセットを 1 つ選択し、アトリビュートビットで 4 つの中からサブ選択できるため、各キャラクターはアトリビュート RAM を介して、任意の時点で 4 つの異なるキャラクターセットから選択できます。
v1.0 40/80 カラム回路図

v1.0 PCB

すべての移設された IC が搭載されたドーターボード。

ドーターボードの裏面。34 ピン CN コネクタはメインボードのビデオ拡張コネクタに接続され、残りはスタンドオフで、元のソケットに挿されていた IC(取り外してドーターカードに移設)をドーターボードまで延長し、再配線するためのものです。

ドーターボードが取り付けられたオリジナルのマザーボード(上の写真)。
ビデオモジュール バージョン 1.1
ビデオモジュール バージョン 1 への関心があり、それが始めたことを完成させる原動力となりました。新しい設計は以下の問題を解決しています:
- KiCad フットプリントエディタが(おそらく私のミスで)2 つの VLSI ゲートアレイのフットプリントを入れ替えてしまいました。修正には精密なはんだ付けと再配線が必要でした。
- オシレーターがクリーンな信号を出力していなかったため、U14B のピン 4 とグランド間に 100pF のセラミックコンデンサを追加して修正しました。これは上記の再配線が一因である可能性があります。
- ゲートアレイの G 信号が回路図では接続されているにもかかわらず、2 つのゲートアレイ間で接続されていませんでした。PCB の断線と思われます。
- アトリビュート RAM / コントロールラッチの競合 - コントロールラッチへの書き込みがアトリビュート RAM を更新してしまいます。元の設計ではこれが問題であることは分かっていましたが、可視化されないだろうと想定していました。
- ゲートアレイのライザーピンとマザーボードソケットの物理的な位置合わせがずれており、取り付けが困難でピンに応力がかかっていました。
項目 4 は、マルチバイブレーター(74HCT123)の後半を使用してイネーブルパルスを延長することで解決しました。0xDFFF の読み取りに続く即座の 0xDFFF への書き込みはコントロールラッチに送られ、0xDFFF の読み取りに続いて NOP を挟んだ後の 0xDFFF への書き込みはアトリビュート RAM に送られます。これにより、リード・モディファイ・ライトのソフトウェアがコントロールラッチに影響しないことが保証されます。
v1.1 カラー回路図

柔軟性を持たせるため、抵抗部分を可変にして、0xDFFF の読み取りとその後の 0xDFFF への書き込みの間隔を微調整できるようにしています。
v1.1 40/80 カラム回路図

v1.1 PCB
バージョン 1.1 では PCB が再設計され、より小型で整理されています。ゲートアレイのリフターソケットの位置は、MZ-80A マザーボードの鉛筆トレースとマイクロメーターを使用して正確な距離を測定し、完成レイアウトを印刷して鉛筆トレースに重ねて位置を検証することで決定しました。MZ-700 では公差がより厳しかったため、この手法を使用する必要がありました。
PCB は製造され、以下の写真の通り組み立てと取り付けが行われています。

MZ-80A 内部への取り付け。

SD カードアダプタはボードに差し込みますが、必要に応じてより便利な場所に簡単に移動できます。外部ビデオコネクタは DIN ソケットに配線されており、元々この目的で用意されていた筐体の切り欠きの一つに収まります。2 つ目の DIN ソケットは、tranZPUter ボードが取り付けられている場合の USB 接続用です。

v1.1 取り付け手順
Sharp MZ-80A のビデオをアップグレードするには、シリアライザー IC 8(74LS165)に新しいビデオ制御信号を注入する必要があります。基本的にロードパルスとクロックパルスの信号は 40/80 モードに応じて変わります。これを行う唯一の方法は、トラックをカットするか IC を取り外すことです。ビンテージ機器の改造は好みませんので、後者を選択しました。つまり IC 8 を取り外してソケットを取り付けます。この方法により、74LS165 を再び取り付けるだけでいつでもオリジナルの状態に戻すことができます。
エレクトロニクスとはんだ付けに精通している方であれば、以下の手順に従って簡単に改造できます:
1) 本体前面のキーボード下にある 2 本のネジ(各コーナーに 1 本)を外します。
2) モニター脚の 4 本のネジを外します。
3) モニターの側面を通り 2 ピンコネクタに接続されているスピーカーケーブルを抜きます。注意:モニターの電源を切った直後にこの作業を行わないでください。しばらく待ちましょう。
4) 本体背面、CRT ガラスネック端の CRT 制御信号入力のすぐ後ろの左側に、RESET、ボリューム、輝度コントロールを搭載した小さなドーターボードがあります。2 つの留め具から慎重に外してください。留め具に過度な力を加えないでください。40 年以上経過した機械なので柔軟性が失われている可能性があります。
5) CRT からマザーボードへのオレンジ色のケーブルをたどり、抜きます(2 本あり、1 本は CRT 用、もう 1 本はテープデッキ用です)。
6) CRT コントロールボードのすぐ下のマザーボード上に、灰色のワイヤーが付いた 2 ピンコネクタ(RESET 信号)があります(手順 4 で取り外したドーターボードからたどることができます)。これを抜きます。
7) CRT モニターを慎重に持ち上げ、安全な場所に置きます。
8) キーボードを固定している 3 本のネジを外し、前方にヒンジさせます。
9) マザーボード背面の各コーナーにある 2 本のネジを外します。
10) PSU から来ている太い黒色のアース線を抜きます。
11) PSU コネクタを抜きます(赤、黄、黒、青のワイヤーで識別できます)。
12) テープデッキのオレンジケーブルを抜きます。
13) キーボードリボンケーブルを慎重に外します。両側を掴み、プッシュフィットコネクタから外すようにゆっくり揺らしながら引き抜きます。
14) マザーボードを慎重に持ち上げて取り外します。若干の背圧が必要です。マザーボード前面の 3 つのプラスチッククリップを曲げようとしないでください。40 年経過したプラスチックはもはや以前ほど柔軟ではありません。
15) ボード後方左側の IC8 を見つけます。2 つの 28 ピン Sharp ブランドのゲートアレイが目印になります。
16) ボードを裏返し、IC をはんだ除去します。
17) IC8 の位置に 16 ピンソケットを取り付けます。
18) マザーボードを再び取り付けます。プラスチッククリップに注意し、固定用の 2 本のネジを戻します。
19) PSU からの黒色のアース線を再接続します。
20) PSU ケーブルを再接続します。赤色のリード線は本体背面側、青色は前面側です。
21) テープデッキケーブルを再接続します。2 つの類似コネクタのうち前面側に接続します。ケーブルには 1 ピン欠けがあり、その側がマザーボードを前面から背面に向かって見て右側を向くようにします。
22) キーボードリボンケーブルを再接続します。両側を持って位置を合わせ、コネクタ(抵抗アレイ RA2 の手前にある長い黒色のコネクタ)にしっかりと押し込みます。
23) ソケットから IC 20 と 31 を取り外します。これらはビデオと Z80 制御のグルーロジックを提供する Sharp ゲートアレイです。
24) ソケットからキャラクタージェネレーター ROM IC 14 を取り外します。
25) ビデオモジュール v1.1 を取り、裏面のソケットライザー(4 個)を対応するソケットに合わせて取り付けます。ライザーピンは曲がりやすく折れやすいので注意してください。エンドコネクタ CN2 を基準点として使用し、CN2 で位置合わせをしたら慎重にボードを押し下げます。抵抗を感じたら裏面を確認してください(スマートフォンのカメラが便利です)。ライザーピンが対応するソケットに正しく合っていることを確認します。
26) CRT モニターを本体の近くに持ってきて、オレンジケーブルを再接続します。
27) 電源を入れ、すべてが正常に動作していることを確認します(映像が表示され、キーボードが機能するなど)。
28) 電源を切り、数分待ちます(またはCRT のコンデンサにはまだ高電圧が残っているので十分注意してください)。モニターを再び取り付けます。モニターはメインハウスベースに合わせてクリックで固定されるはずです。オレンジケーブルは手順 27 で既に接続済みです。
29) 2 ピン RESET コネクタ(灰色ワイヤー付き)を再接続します。CRT メインボードのすぐ下、おおよそ中央部のマザーボードに接続します。
30) 背面のドーターボード(Reset、ボリューム、輝度コントロールを搭載)を再び取り付けます。切り欠きに合わせて慎重に押し込むと、クリックで固定されます。
31) モニターをメインハウジングに固定する 4 本のネジを再び取り付けて締めます。
32) CRT メインボードの 2 ピンスピーカーワイヤーを再接続します。コネクタは 2 本の突起ピンだけなので見つけにくいです。スピーカーワイヤーはモニター側面の溝に沿って配線します。
33) キーボードを平らに置き、固定用の 3 本のネジを再び挿入します。
34) 電源を入れてすべてがまだ正常に動作しているか確認します。動作しない場合は手順 26 から確認し、何か見落としがないか確認してください。
35) 蓋を閉じ、キーボード下の本体前面にある 2 本のネジを再び挿入して蓋を固定します。
エレクトロニクスに不慣れな方は、変更を行える友人や地元の修理店を見つけるのが最善の方法です。
ビデオモジュール バージョン 2.0
Sharp MZ エミュレーター(FPGA 内にカプセル化された一連の Sharp MZ マシン)と、オリジナルマシンの実ハードウェアで同じ機能を実現することの融合を目指す中で、ビデオ機能のアップグレードが必要です。オリジナルの(ビンテージ)マシンを物理的に改造せず、取り外し可能な追加機能を付加するという同じテーマを維持しながら、次の段階はビデオモジュールの作成です。オリジナルのソケット挿しのビデオ IC の代わりに設置し、Sharp MZ エミュレーターに搭載されているすべての機能を提供します。つまり、Sharp シリーズすべてのマシンと互換性のあるビデオを提供できるので、グラフィックス付きの MZ80B プログラムを Sharp MZ80A で実行すると、MZ80B とまったく同じように表示されます。
この設計は CPLD と FPGA を使用して必要な機能を提供します。Sharp MZ エミュレーターの VHDL をビデオモジュールの FPGA で動作するよう適応させ、十分なグルーロジックにより Sharp MZ80A のビデオスクリーンと外部カラー VGA ディスプレイを駆動し、同時にソフトウェアからは Sharp MZ シリーズのいずれかのマシンのビデオハードウェアとして認識されます。
以下のセクションでは、現在製造中の回路と PCB の詳細を説明します。
v2.0 CPLD および FPGA 回路図

この設計の中核は、v1.0 のすべてのディスクリートロジックを置き換える FPGA です。v2.0 の要件は、v1.0 の 40/80 カラムおよびカラー機能だけでなく、MZ80B とその 2 つのグラフィックスオプション、MZ-700 のアトリビュートの違いとの互換性を追加することです。ビデオメモリはロジックとともに FPGA 内の BRAM としてインスタンス化されています。
CPLD の主な役割は、Sharp ロジックの 5V を FPGA の 3.3V に変換することです(FPGA は 5V 耐性がありません)。また、周波数生成やタイミングなど、MB14298/MB14299 ゲートアレイのロジックの一部も代替します。
v2.0 VGA 出力回路図

バージョン 1.0 とは対照的に、バージョン 2.0 は既存のゲートアレイ、ビデオシフトレジスタ、CGROM、RAM を再利用しません。これらはマザーボードから取り外し、ソケットを介したシンプルな接続が行われます。つまり、ビデオは 74LS165 の出力(ピン 9)と MB14298 からの同期信号(HSY と SYNCH)によって生成され、これらのロケーションはマザーボードから持ち上げて CPLD から供給されます。
さらに、真の 4 ビット RGB 出力が RGB およびコンポジット出力に供給されるようになりました。Sharp は MZ80B ではモノクロのみ、MZ-700/80A では前景 8 色+背景 8 色ですが、この小さな追加により、MZ80A のカラー輝度信号や将来の拡張などの機能の色の範囲が柔軟になります。
v2.0 電源回路図

設計に FPGA を使用すると、より複雑な電源要件が発生します。Sharp MZ80A は 12V、5V、-5V の 3 つの電圧を使用し、FPGA はさらに 3.3V、2.5V、1.2V を追加します。幸いなことに、この設計のすべては持ち上げたソケットとメインボードの CN1 コネクタから取得する 5V に基づいているため、Altera が指定する十分なデカップリングとともに、3 つの追加電圧を生成する標準的な LDO レギュレーターを追加するだけで済みます。
v2.0 PCB



v2.0 取り付け手順
Sharp MZ-80A のビデオをアップグレードするには、シリアライザー IC 8(74LS165)に新しいビデオ制御信号を注入する必要があります。基本的にロードパルスとクロックパルスの信号は 40/80 モードに応じて変わります。これを行う唯一の方法は、トラックをカットするか IC を取り外すことです。ビンテージ機器の改造は好みませんので、後者を選択しました。つまり IC 8 を取り外してソケットを取り付けます。この方法により、74LS165 を再び取り付けるだけでいつでもオリジナルの状態に戻すことができます。
注意:この変更を行う前に tranZPUter または tranZPUter SW を取り付けておく必要があります。これがないとビデオモジュールは起動しません。
エレクトロニクスとはんだ付けに精通している方であれば、以下の手順に従って簡単に改造できます:
1) 本体前面のキーボード下にある 2 本のネジ(各コーナーに 1 本)を外します。
2) モニター脚の 4 本のネジを外します。
3) モニターの側面を通り 2 ピンコネクタに接続されているスピーカーケーブルを抜きます。注意:モニターの電源を切った直後にこの作業を行わないでください。しばらく待ちましょう。
4) 本体背面、CRT ガラスネック端の CRT 制御信号入力のすぐ後ろの左側に、RESET、ボリューム、輝度コントロールを搭載した小さなドーターボードがあります。2 つの留め具から慎重に外してください。留め具に過度な力を加えないでください。40 年以上経過した機械なので柔軟性が失われている可能性があります。
5) CRT からマザーボードへのオレンジ色のケーブルをたどり、抜きます(2 本あり、1 本は CRT 用、もう 1 本はテープデッキ用です)。
6) CRT コントロールボードのすぐ下のマザーボード上に、灰色のワイヤーが付いた 2 ピンコネクタ(RESET 信号)があります(手順 4 で取り外したドーターボードからたどることができます)。これを抜きます。
7) CRT モニターを慎重に持ち上げ、安全な場所に置きます。
8) キーボードを固定している 3 本のネジを外し、前方にヒンジさせます。
9) マザーボード背面の各コーナーにある 2 本のネジを外します。
10) PSU から来ている太い黒色のアース線を抜きます。
11) PSU コネクタを抜きます(赤、黄、黒、青のワイヤーで識別できます)。
12) テープデッキのオレンジケーブルを抜きます。
13) キーボードリボンケーブルを慎重に外します。両側を掴み、プッシュフィットコネクタから外すようにゆっくり揺らしながら引き抜きます。
14) マザーボードを慎重に持ち上げて取り外します。若干の背圧が必要です。マザーボード前面の 3 つのプラスチッククリップを曲げようとしないでください。40 年経過したプラスチックはもはや以前ほど柔軟ではありません。
15) ボード後方左側の IC8 を見つけます。2 つの 28 ピン Sharp ブランドのゲートアレイが目印になります。
16) ボードを裏返し、IC をはんだ除去します。
17) IC8 の位置に 16 ピンソケットを取り付けます。
18) マザーボードを再び取り付けます。プラスチッククリップに注意し、固定用の 2 本のネジを戻します。
19) PSU からの黒色のアース線を再接続します。
20) PSU ケーブルを再接続します。赤色のリード線は本体背面側、青色は前面側です。
21) テープデッキケーブルを再接続します。2 つの類似コネクタのうち前面側に接続します。ケーブルには 1 ピン欠けがあり、その側がマザーボードを前面から背面に向かって見て右側を向くようにします。
22) キーボードリボンケーブルを再接続します。両側を持って位置を合わせ、コネクタ(抵抗アレイ RA2 の手前にある長い黒色のコネクタ)にしっかりと押し込みます。
23) ソケットから IC 20 と 31 を取り外します。これらはビデオと Z80 制御のグルーロジックを提供する Sharp ゲートアレイです。
24) ソケットからビデオ RAM IC 15 を取り外します。
25) ビデオモジュール v2.0 を取り、裏面のソケットライザー(3 個)を対応するソケットに合わせて取り付けます。ライザーピンは曲がりやすく折れやすいので注意してください。エンドコネクタ CN2 を基準点として使用し、CN2 で位置合わせをしたら慎重にボードを押し下げます。抵抗を感じたら裏面を確認してください(スマートフォンのカメラが便利です)。ライザーピンが対応するソケットに正しく合っていることを確認します。
26) ビデオモジュールの J1/IOEXT と tranZPUter SW ボードの J2/Video Ext の間に 6 ピンリボンケーブルを接続します。
27) CRT モニターを本体の近くに持ってきて、オレンジケーブルを再接続します。
28) 電源を入れ、すべてが正常に動作していることを確認します(映像が表示され、キーボードが機能するなど)。
29) 電源を切り、数分待ちます(またはCRT のコンデンサにはまだ高電圧が残っているので十分注意してください)。モニターを再び取り付けます。モニターはメインハウスベースに合わせてクリックで固定されるはずです。オレンジケーブルは手順 27 で既に接続済みです。
30) 2 ピン RESET コネクタ(灰色ワイヤー付き)を再接続します。CRT メインボードのすぐ下、おおよそ中央部のマザーボードに接続します。
31) 背面のドーターボード(Reset、ボリューム、輝度コントロールを搭載)を再び取り付けます。切り欠きに合わせて慎重に押し込むと、クリックで固定されます。
32) モニターをメインハウジングに固定する 4 本のネジを再び取り付けて締めます。
33) CRT メインボードの 2 ピンスピーカーワイヤーを再接続します。コネクタは 2 本の突起ピンだけなので見つけにくいです。スピーカーワイヤーはモニター側面の溝に沿って配線します。
34) キーボードを平らに置き、固定用の 3 本のネジを再び挿入します。
35) 電源を入れてすべてがまだ正常に動作しているか確認します。動作しない場合は手順 26 から確認し、何か見落としがないか確認してください。
36) 蓋を閉じ、キーボード下の本体前面にある 2 本のネジを再び挿入して蓋を固定します。
エレクトロニクスに不慣れな方は、変更を行える友人や地元の修理店を見つけるのが最善の方法です。
設計の詳細
ビデオモジュール v2.x
FPGA を使用することで、ビデオモジュール v2.x はほぼすべての 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 FPGA のメモリ不足のため、640x200 モードではディスプレイはダブルバッファリングされず、必要に応じて画面のスノー/ティアリングを防止するオプションの WAIT ステートジェネレーターを有効にできます。
グラフィックスフレームバッファの RAM は、プログラマブルレジスタによって CPU メインアドレス範囲 C000H – FFFFH に 1 バンクずつ(Red、Green、Blue バンク)切り替えることができます。これにより、CPU から直接アドレス指定可能なピクセルの読み書きが可能になります。各ピクセルは 8 つのグループ(RAM の 1 バイト)で格納され、バイトごとに右から左、行ごとに左から右、上から下にスキャンされます。つまり、Red バンクが CPU アドレス空間にマッピングされている場合、C000H のバイトは 320/640(X)のうちの赤ピクセル 7 ~ 0 で、200(Y)のうちのピクセル 0 を表します。C000H に 01H を書き込むとピクセル 7(X)、行 0(Y)がオンになり、C000H に 80H を書き込むとピクセル 0(X)、行 0(Y)がオンになります。Green と Blue バンクが CPU アドレス空間にマッピングされている場合も同様です。
表示を高速化するために、カラーライトレジスタ(Sharp MZ-2500 で利用可能なものと同様)が用意されており、グラフィックス RAM への書き込みで 3 つのバンクすべてを同時に更新できるため、即座にカラー書き込みが可能になります。
プログラマブルレジスタ
ビデオ機能を利用するために、すべての機能にアクセスできる一連のレジスタが設計されています。
機能は以下のようにグループ化されています:
- 制御 - ビデオ機能モードの設定、カラム幅の設定、カラー/モノクロ機能の設定。
- グラフィックス - グラフィックス機能の設定。
- GPU - ビデオタスクを高速化するための内蔵グラフィックスプロセッサへのタスクオフロード。
- パレット - ディスプレイパレットの設定と構成。
レジスタは上位 I/O 領域 0xD0 ~ 0xFD に配置され、標準的な Z80 I/O コマンド IN/OUT でアクセスします。特に記載がない限り、すべてのレジスタは読み書き可能で、読み取りは現在の格納値を返します。
コントロールレジスタ (0xF8 - 10進 248)
ビデオモードレジスタです。ビデオモジュールが動作するハードウェアモデルを指定し、出力ディスプレイのカラム幅とカラー機能も指定します。
| Bits | Dir | Description |
|---|---|---|
| 2:0 | R/W | ビデオモジュールのハードウェアモデルを設定。 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 - 10進 249)
グラフィックスモード制御レジスタです。出力するビデオの内容、ブレンド方法、読み書き可能なグラフィックス RAM バンクを指定します。
| Bits | Dir | Description |
|---|---|---|
| 1:0 | R/W | 読み取りモード(00=Red バンク、01=Green バンク、10=Blue バンク、11=未使用)。CPU アドレス空間で有効時に読み取るバンクを選択。 |
| 3:2 | R/W | 書き込みモード(00=Red バンク、01=Green バンク、10=Blue バンク、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 - 10進 250 ~ 0xFC - 10進 252)
間接モード(コントロールレジスタのビット 3/2 を 11 に設定)では、CPU アドレス空間 C000H – FFFFH にマッピングされたグラフィックス RAM への書き込み時に、バイトが Red カラーライターレジスタでマスクされて Red バンクに書き込まれ、Green と Blue も同様の操作が行われます。これにより、3 つのバンクにわたる色の高速設定が可能になります。
例:Red フィルター = 0x80、Green フィルター = 0x40、Blue フィルター = 0x20 の場合、アドレス C000H への間接書き込みでピクセル 0,0 が赤、1,0 が緑、2,0 が青に設定されます。
| Bit | Dir | Pixel | I/O Addr | Colour | Description |
|---|---|---|---|---|---|
| 0 | R/W | 7 | 0xFAH | Red | 間接書き込み時に赤に設定。 |
| 1 | R/W | 6 | 0xFAH | Red | |
| 2 | R/W | 5 | 0xFAH | Red | |
| 3 | R/W | 4 | 0xFAH | Red | |
| 4 | R/W | 3 | 0xFAH | Red | |
| 5 | R/W | 2 | 0xFAH | Red | |
| 6 | R/W | 1 | 0xFAH | Red | |
| 7 | R/W | 0 | 0xFAH | Red | 間接書き込み時に赤に設定。 |
| 0 | R/W | 7 | 0xFBH | Green | 間接書き込み時に緑に設定。 |
| 1 | R/W | 6 | 0xFBH | Green | |
| 2 | R/W | 5 | 0xFBH | Green | |
| 3 | R/W | 4 | 0xFBH | Green | |
| 4 | R/W | 3 | 0xFBH | Green | |
| 5 | R/W | 2 | 0xFBH | Green | |
| 6 | R/W | 1 | 0xFBH | Green | |
| 7 | R/W | 0 | 0xFBH | Green | 間接書き込み時に緑に設定。 |
| 0 | R/W | 7 | 0xFCH | Blue | 間接書き込み時に青に設定。 |
| 1 | R/W | 6 | 0xFCH | Blue | |
| 2 | R/W | 5 | 0xFCH | Blue | |
| 3 | R/W | 4 | 0xFCH | Blue | |
| 4 | R/W | 3 | 0xFCH | Blue | |
| 5 | R/W | 2 | 0xFCH | Blue | |
| 6 | R/W | 1 | 0xFCH | Blue | |
| 7 | R/W | 0 | 0xFCH | Blue | 間接書き込み時に青に設定。 |
メモリページレジスタ (0xFD - 10進 253)
このレジスタは、ビデオメモリを Z80 アドレス空間に有効化する役割を持ちます。3 つのカラー 16KB GRAM のうち 1 つ(グラフィックスモードレジスタで選択)を Z80 アドレス C000:FFFF に、または CGROM を Z80 アドレス空間 D000:DFFF に有効化できます。このレジスタは他のすべてのメモリページ設定を上書きします。
| Bits | Dir | Description |
|---|---|---|
| 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 ページイン。 |
ビデオモジュールステータスレジスタ (0xFD - 10進 253)
このレジスタはビデオモジュールのステータスを報告します。ビット 7 と 0 はメモリページレジスタの設定を報告するために予約されています。
| Bits | Dir | Description |
|---|---|---|
| 5 | R | フレームバッファ水平ブランキング。1 = 水平ブランキング有効、0 = 水平ブランキングなし。 |
| 6 | R | フレームバッファ垂直ブランキング。1 = 垂直ブランキング有効、0 = 垂直ブランキングなし。 |
GPU パラメータレジスタ (0xF6 - 10進 246)
このレジスタからの読み取りはビット 7:0 をポップし、レジスタを 8 ビット右にシフトします。
GPU コマンドレジスタ (0xF7 - 10進 247)
| Command | Parameters | Description |
|---|---|---|
| 0x00 | n/a | 操作なし。GPU がビジーでないときのアイドル状態コマンドで、発行しても何も行いません。 |
| 0x01 | n/a | VRAM 画面クリア。ビデオ RAM とアトリビュート RAM 全体がスペース文字(空白)でクリアされ、青背景に白文字になります。 |
| 0x02 | [15:8] - キャラクター [7:0] - アトリビュートバイト |
キャラクターとアトリビュートで VRAM 画面をクリア。ビデオ RAM とアトリビュート RAM 全体がパラメータリストで指定された値でクリアされます。 |
| 0x03 | [47:40] - 開始 X [39:32] - 開始 Y [31:24] - 終了 X [23:16] - 終了 Y [15:8] - 表示キャラクター [7:0] - アトリビュートバイト |
ビデオ RAM とアトリビュート RAM の一部が指定されたキャラクターとアトリビュート値でクリアされます。開始 X/Y から終了 X/Y まで。 |
| 0x81 | n/a | 16KB フレームバッファ(red/green/blue)全体がクリアされます。 |
| 0x82 | [87:72] - 開始 X [71:56] - 開始 Y [55:40] - 終了 X [39:24] - 終了 Y [23:16] - Red フィルター [15:8] - Green フィルター [7:0] - Blue フィルター R/G/B フィルターは 8 ピクセル幅、ビット 7 が最左ピクセル。 |
16KB フレームバッファ(red/green/blue)の一部が指定パラメータに従ってクリアされます。開始 X/Y から終了 X/Y のエリアがクリアされ、フィルターがこのエリアのピクセルをその値に従って設定します。1 = 対応するピクセルを設定、0 = 対応するピクセルをクリア。 |
| 0xFF | n/a | GPU をリセット。実行中の操作をキャンセルし、即座にアイドル状態に戻ります。 |
GPU ステータスレジスタ (0xF7 - 10進 247)
このレジスタは現在の GPU ステータスを返し、新しいコマンドを要求する前にポーリングする必要があります。
| Bits | Dir | Function | Description |
|---|---|---|---|
| 0 | R | BUSY | GPU のビジー状態を示すフラグ。1 = ビジー、0 = アイドル。ビジーの場合、GPU がアイドルに戻るまで RESET コマンド以外のコマンドは処理されません(RESET コマンドは即座に実行されます)。 |
VGA ボーダーエリアレジスタ (0xF3 - 10進 243)
VGA モードでは、グラフィックス RAM/VRAM の拡張がディスプレイエリア全体を完全に埋めず、通常は空白のままです。このレジスタにより、必要に応じて異なる色を適用するアトリビュートを設定できます。
| Bits | Dir | Description |
|---|---|---|
| 2:0 | R/W | ボーダー色を設定。 2: = Red 1: = Green 0: = Blue |
パレット選択レジスタ (0xF5 - 10進 245)
256 のパレットがあり、0 はシステムカラーのデフォルト、1..255 は FPGA HDL コンパイル時に固定されたパレットです。パレットは以下のパレット設定レジスタを介して再プログラムできます。
パレット設定 Off ポインターレジスタ (0xD3 - 10進 211)
ピクセル(R/G/B)がオフ状態のときに設定されるパレット番号を設定するレジスタです。つまり、ピクセルがオフのときに出力される色です。実際のパレット色レジスタへの書き込みの前にこのレジスタに書き込みます。
パレット設定 On ポインターレジスタ (0xD4 - 10進 212)
ピクセル(R/G/B)がオン状態のときに設定されるパレット番号を設定するレジスタです。つまり、ピクセルがオンのときに出力される色です。実際のパレット色レジスタへの書き込みの前にこのレジスタに書き込みます。
パレット Red 値設定レジスタ (0xD5 - 10進 213)
Off/On ポインターレジスタで選択されたパレットで使用する 5 ビットの Red 値を設定するレジスタです。
パレット Green 値設定レジスタ (0xD6 - 10進 214)
Off/On ポインターレジスタで選択されたパレットで使用する 5 ビットの Green 値を設定するレジスタです。
パレット Blue 値設定レジスタ (0xD7 - 10進 215)
Off/On ポインターレジスタで選択されたパレットで使用する 5 ビットの Blue 値を設定するレジスタです。
ビデオモードパラメータレジスタ (0xD0 - 10進 208)
以下の表は、現在のビデオモードとパラメータ番号の概要です。アクティブモードはコントロールレジスタで設定され、パラメータはビデオモードパラメータレジスタを介して更新できます。
フロントポーチは XXX_SYNC_START パラメータに含まれます。バックポーチは XXX_LINE_END に含まれます。つまり、XXX_LINE_END - XXX_SYNC_END = バックポーチです。
| Param Number | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Mode | Description | 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 マシン、モノクロ 60Hz 表示、512 x 260 スキャン、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 |
| 1 | MZ80K/C/1200/A マシン、拡張モノクロ 60Hz 表示、1024 x 260 スキャン、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、512 x 260 スキャン、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、1024 x 260 スキャン、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 - 10進 209)
このレジスタは、ビデオモードパラメータレジスタで選択されたパラメータの下位バイトを書き込むために使用します。例:パラメータ 0 が設定されている場合、このレジスタへの書き込みは H_DSP_START パラメータの下位バイトを更新します。
ビデオモード上位パラメータバイトレジスタ (0xD2 - 10進 210)
このレジスタは、ビデオモードパラメータレジスタで選択されたパラメータの上位バイトを書き込むために使用します。例:パラメータ 0 が設定されている場合、このレジスタへの書き込みは H_DSP_START パラメータの上位バイトを更新します。
ソフトウェア バージョン 1
すべての制御は、アドレスロケーション 0xDFFF のラッチ IC U9(v1.0)または U11(v1.1)を介して行われます。
このアドレスはアトリビュート RAM とコントロールラッチの間で共有されています。バージョン 1.0 では、プロジェクト開始時に画面外であるため問題ないと判断しましたが、ハードウェアスクロールを見落としていたため、このロケーションへの書き込みは、キャラクター RAM が最下部までスクロールされて可視状態にある場合にのみ、最後のキャラクターのアトリビュートを破損する*可能性*があります。
バージョン 1.1 では、このバグはマルチバイブレーター回路で修正されました。0xDFFF への読み取り時にトリガーされ、Z80 の 1 命令サイクル強で リセットされます。これにより LD HL, 0xDFFF; LD B, 0x80; LD A,(HL); LD (HL), B 操作でラッチの状態を変更できます。
以下の表は、74HCT373 オクタルラッチである IC U9/U11 のビット機能を示しています。40 カラムから 80 カラムモードへの切り替えには、コントロールアドレス 0xDFFF に 0x80 を書き込む必要があります。
| Bit | Function | Description |
|---|---|---|
| 0 | キャラクター ROM セットビット 0 | 4 つのキャラクタージェネレーター ROM セットのうち 1 つを選択。 |
| 1 | キャラクター ROM セットビット 1 | |
| 2 | 未使用 | |
| 3 | 未使用 | |
| 4 | 未使用 | |
| 5 | 未使用 | |
| 6 | 未使用 | |
| 7 | 40/80 カラムモード | 1 に設定すると 80 カラムモード有効、0 に設定すると 40 カラム(デフォルト) |
カラーボードのキャラクタージェネレーター ROM には最大 16 の CG-ROM イメージを格納して選択できます。ほとんどの MZ80 マシンでは CG-ROM のサイズは 2K です。MZ700/800 では 4K です。すべての Sharp CG-ROM イメージをまだ入手していないため、当面キャラクタージェネレーターフラッシュ RAM(IC U10)は以下のようにロードされています:
| Slot | Attribute Bits 7,3 | U9 Latch Bits 0:1 | Size | ROM | Description |
|---|---|---|---|---|---|
| 0 | 0,0 | 0,0 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 1 | 0,1 | 0,0 | 2K | MZ80K_cgrom.rom | MZ80K ヨーロッパ版 CG-ROM |
| 2 | 1,0 | 0,0 | 2K | MZ80K2E_Jap_cgrom.rom | MZ80K 日本語 CG-ROM |
| 3 | 1,1 | 0,0 | 2K | MZFONT.rom | 出自不明 CG-ROM |
| 4 & 5 | 0,0 - 0,1 | 0,1 | 4K | MZ700_cgrom.rom | MZ700 ヨーロッパ版 CG-ROM(2 バンク) |
| 6 & 7 | 1,0 - 1,1 | 0,1 | 4K | MZ700_cgrom_jp.rom | MZ700 日本語 CG-ROM(2 バンク) |
| 8 | 0,0 | 1,0 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 9 | 0,1 | 1,0 | 2K | MZ80B.rom | MZ80B ヨーロッパ版 CG-ROM |
| 10 | 1,0 | 1,0 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 11 | 1,1 | 1,0 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 12 | 0,0 | 1,1 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 13 | 0,1 | 1,1 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 14 | 1,0 | 1,1 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
| 15 | 1,1 | 1,1 | 2K | mz-80acg.rom | MZ80A ヨーロッパ版 CG-ROM |
このイメージは、リポジトリ内のシェルスクリプト [ABS PATH]/software/tools/make_cgrom.sh で作成され、以下のように実行できます:
cd [ABS PATH]/software
./tools/make_cgrom.sh
出力イメージ(../../MZ80A_80COLOUR/software/roms/COLOURBOARD_CG.rom)は、28C256 フラッシュ RAM に直接書き込んでカラーボードに搭載できます。
カラー出力で色を設定するには、キャラクター RAM に書き込まれる各キャラクターに対して、アトリビュートバイトをアトリビュート RAM に書き込みます。アトリビュート RAM のビットには以下の機能があります:
| Bit | Function |
|---|---|
| 0 | 背景 Blue |
| 1 | 背景 Red |
| 2 | 背景 Green |
| 3 | キャラクター ROM ビット 0 |
| 4 | 前景 Blue |
| 5 | 前景 Red |
| 6 | 前景 Green |
| 7 | キャラクター ROM ビット 1 |
画面位置 0,0 にキャラクター 'A' を黒背景に青文字で書き込むには、キャラクター RAM ロケーション 0xD000 に 0x41 を書き込み、アトリビュート RAM ロケーション 0xD800 に 0x10 を書き込みます。これはキャラクタージェネレーターサブセット 0 を前提としています。
4 つのキャラクタージェネレーターセットのうち 1 つを選択するには、IC U9/U11 のビット 1:0 を設定します。次に 4 つのキャラクターサブセットのうち 1 つを選択するには、上の表に従ってアトリビュートビット 7 と 3 を設定します。
例:IC U9/U11 のビット 1:0 を '00' に設定すると、スロット 0-3 のキャラクタージェネレーターセット 0 が有効になります。次にロケーション 0xD000 に 0x41、0xD001 に 0x42、ロケーション 0xD800 に 0x14、0xD801 に 0xF0 を書き込むと、画面上に黒背景に青の文字 A と、その直後に黒背景に白の日本語キャラクターが表示されます。
ソフトウェア バージョン 2
- VideoInterface - CPLD で、オリジナルの Sharp MZ80A マザーボードハードウェアと直接インターフェースし、5V 耐性を持ちます。メインボードと FPGA 間のゲートウェイとして機能し、元々 MB14298/MB14299 ゲートアレイが提供していた信号をメインボードに供給します。
- VideoController - FPGA で、RAM を含むすべてのビデオ機能を提供します。
VideoController はピクセルマップグラフィックスおよび Sharp MZ シリーズのビデオ機能を含むすべてのビデオ機能を提供します。
リポジトリ構造
パス
読みやすさのため、この章では以下の短縮名が対応するパスを指します。
| Short Name | Path | Description |
|---|---|---|
| [<ABS PATH>] | このリポジトリがシステム上に展開されたパス。 | |
| <80COL> | [<ABS PATH>]/MZ80A_80COLOUR/ | リポジトリのルートディレクトリ。 |
| <CPLD> | [<ABS PATH>]/MZ80A_80COLOUR/CPLD | VideoInterface に使用される Complex Programmable Logic Device の RTL およびビルドファイル。 |
| <FPGA> | [<ABS PATH>]/MZ80A_80COLOUR/FPGA | VideoController に使用される Field Programmable Gate Array の RTL およびビルドファイル。 |
| <PCB> | [<ABS PATH>]/MZ80A_80COLOUR/pcb | PCB 作成用のガーバーファイル。各バージョンは個別のサブディレクトリに格納。 |
| <SCHEMATICS> | [<ABS PATH>]/MZ80A_80COLOUR/schematics | コンポーネントライブラリ定義を含む KiCad 回路図および PCB 設計ファイル。 |
| <SOFTWARE> | [<ABS PATH>]/MZ80A_80COLOUR/software | プロジェクトで使用されるソフトウェアのルートディレクトリ。 |
| <TOOLS> | [<ABS PATH>]/MZ80A_80COLOUR/software/tools | キャラクタージェネレーター ROM 作成用のシェルスクリプト。 |
| <ROMS> | [<ABS PATH>]/MZ80A_80COLOUR/software/roms | オリジナルのキャラクタージェネレーター ROM とプロジェクト用の統合 ROM。 |
| <MIF> | [<ABS PATH>]/MZ80A_80COLOUR/software/mif | FPGA 用メモリ初期化ファイル。CG ROM とパレット ROM を含む。 |
| <DOCKER> | [<ABS PATH>]/MZ80A_80COLOUR/docker | Altera Quartus Prime を実行する Docker イメージをビルドするための Docker 記述ファイル。 |
| <DOCS> | [<ABS PATH>]/MZ80A_80COLOUR/docs | プロジェクトに関連するドキュメント。 |
RTL
| Folder | RTL File | Description |
|---|---|---|
| <CPLD> | VideoInterface_pkg.vhd | ビデオインターフェースの設定ファイル。 |
| VideoInterface_TopLevel.vhd | ピン定義を実際のビデオインターフェースモジュールに接続するトップレベル設計ファイル。 | |
| VideoInterface.vhd | ビデオインターフェースに必要なロジックを記述するメインモジュール。 | |
| <CPLD>/build | VideoInterface.qpf | Altera プロジェクト定義ファイル。このプロジェクトの Quartus II エントリポイント。 |
| VideoInterface.qsf | 使用するハードウェア、設定、CPLD ピンの割り当てを記述する Altera プロジェクトリソースファイル。 | |
| VideoInterface_constraints.sdc | プロジェクトのコンパイル時にコンパイラをガイドするタイミング定義と制約を設定するタイミング制約ファイル。 | |
| <FPGA> | VideoController_pkg.vhd | ビデオコントローラの設定ファイル。 |
| VideoController_TopLevel.vhd | ピン定義を実際のビデオコントローラモジュールに接続するトップレベル設計ファイル。 | |
| VideoController.vhd | ビデオコントローラに必要なロジックを記述するメインモジュール。 | |
| <CPLD>/build | VideoController.qpf | Altera プロジェクト定義ファイル。このプロジェクトの Quartus II エントリポイント。 |
| VideoController.qsf | 使用するハードウェア、設定、FPGA ピンの割り当てを記述する Altera プロジェクトリソースファイル。 | |
| VideoController_constraints.sdc | プロジェクトのコンパイル時にコンパイラをガイドするタイミング定義と制約を設定するタイミング制約ファイル。 | |
| Clock_* | 各種開発ボードのソースクロック用にリファクタリングされた Altera PLL 定義。将来的な Xilinx ファブリックへの対応のため、よりジェネリックにする必要があります。 | |
| <FPGA>/devices | RAM | デュアルポート RAM |
ハードウェア記述言語
ビットマップの作成にはさまざまな手段がありますが、一般的にはソフトウェアのソースコードに似たハードウェア記述言語が使用されます。VHDL は大学で学んだ ADA に基づいていたため、VHDL を選択しました。Verilog と System Verilog も使用したことがあり、これらの言語も優れており、Sharp MZ エミュレーターで使用していますが、このプロジェクトでは VHDL を選択しました。
CPLD と FPGA はどちらも、Sharp MZ エミュレーターのコードの再利用のしやすさに基づいて選択しました。エミュレーターは Intel/Altera Cyclone V を使用していたため、同社の製品を継続使用することが理にかなっていました。CPLD は 512 マクロセルの MAX 7000A デバイスを選択しました。これは最新のデバイスには搭載されていない 5V 耐性機能を持っており、そうでなければ Sharp MZ-80A の信号を読み取るために追加の電圧変換回路が必要になるためです。FPGA は価格/パッケージ/機能の要件に基づいて選択し、BGA ではなく、既存の Sharp MZ エミュレーターのビデオロジック HDL を組み込むことができ、少なくとも 64K の内部ブロック RAM が必要でした。Cyclone III EP3C25 デバイスを選択しましたが、Sharp MZ エミュレーターのすべてのコードを使用するにはメモリが十分ではありませんが、一部の手直し後に完全に許容範囲です。
Complex Logic Device - MAX 7000A
CPLD(VideoInterface と呼ばれる)は、Z80 の 5V の世界と FPGA の 3.3/2.5/1.2V の世界の間のブリッジです。その目的は以下を提供することです:
- Sharp VLSI ゲートアレイロジックの代替。
- システムおよびビデオクロック(8MHz、4MHz、3.54MHz、2MHz、1MHz、31.5KHz)。
- tranZPUter がビデオモジュールに存在しないリアルタイムの欠落信号(A15-A11、Video RDn/WRn、IORQn)を転送するためのシリアライザー。
- ソフトウェア制御のモード制御レジスタ。
- 電圧変換。
CPLD 設定を構成するソースファイル:
| Module | Description |
|---|---|
| VideoInterface_TopLevel.vhd | トップレベル設計ファイル。回路のルート回路図に相当します。CPLD に入力される主要なコンポーネント信号とその使用方法を配置します。 |
| VideoInterface_pkg.vhd | 関数、定数宣言、パラメータを含むファイルで、すべてのコンパイルされた VHDL ファイル/モジュールで使用されます。 |
| VideoInterface.vhd | メインの設計ファイルで、CPLD 内のターゲット回路のゲートとワイヤーの相互接続を形成するすべてのロジックを含みます。 |
| build/VideoInterface.qpf | Quartus Prime がプロジェクトとそのすべてのファイルを宣言するために使用するプロジェクトファイル。 |
| build/VideoInterface.qsf | 定義と割り当てファイル。コンパイル、フィッティング、使用するピンとその名前、パラメータなどのすべてのパラメータを設定します。Quartus Prime で作成されますが、Quartus Prime GUI を使用するよりも手動で変更する方が速い場合が多いです。 |
| build/VideoInterface_constraints.sdc | Time Quest タイミングアナライザーで作成・使用されるタイミング制約ファイル。CPLD 内のコンポーネントの配置場所を決定する際にコンパイラとフィッターでも使用されます。 |
CPLD ビットストリームのビルド
Quartus Prime を Windows/Linux ワークステーションにインストールするか、以下に詳述する Docker イメージを作成できます。さまざまな Linux および Windows フレーバーでの多数のインストールの後、Docker の使用がこの複雑なパッケージを使用する最も簡単な方法です。
コンパイル:
1. Quartus Prime v13.0.1 を起動します(ローカルインストールまたは Docker イメージ)。
2. 'File->Open Project' でリポジトリクローンが保存されているディレクトリを検索し、<Clone Path>/MZ80A_80COLOUR/CPLD/build/VideoInterface.qpf ファイルを選択します。CPLD VideoInterface プロジェクトが開きます。
3. 'Processing->Start Compilation' を選択します。警告メッセージは無視して問題ありません。
4. 完了すると、<Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files ディレクトリに VideoInterface.sof という名前のビットストリームが作成されます。
プログラミング:
1. ビットストリームを CPLD にアップロードするには、Altera USB Blaster を USB ポート経由でビデオモジュール v2.x ボードの 10 ピン JTAG IDC コネクタに接続する必要があります。
2. Quartus Prime で 'Tools->Programmer' に進むと、新しい Programmer ウィンドウが起動します。
3. Programmer ウィンドウで 'Hardware Setup' をクリックし、USB アダプタを選択して 'Close' します。
4. 'Auto Detect' をクリックすると、EPM7512AET144、EP3C25E144、EPCS16 の 3 つのデバイスが検出されるはずです。
5. EPM7512AET144 デバイスを右クリックし、Add File を選択して <Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files/VideoInterface.sof にある sof ファイルを選択し、Open をクリックします。
6. EPM7512AET144 に対して 'Program/Configure' と 'Verify' のチェックボックスを選択します。
7. 'Start' をクリックすると、コンパイルされたビットストリームで CPLD がプログラムされます。
Field Programmable Gate Array
VideoController の Cyclone III FPGA は、Sharp MZ-80A の強化されたビデオ機能を提供します。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。
- オリジナルモードでの内部と外部の同時表示、VGA モードでは外部のみ。
| Module | Description |
|---|---|
| VideoController_Toplevel.vhd | トップレベル設計ファイル。回路のルート回路図に相当します。FPGA に入力される主要なコンポーネント信号とその使用方法を配置します。 |
| VideoController_pkg.vhd | 関数、定数宣言、パラメータを含むファイルで、すべてのコンパイルされた VHDL ファイル/モジュールで使用されます。 |
| VideoController.vhd | メインの設計ファイルで、FPGA 内のターゲット回路のゲートとワイヤーの相互接続を形成するすべてのロジックを含みます。 |
| build/VideoController.qpf | Quartus Prime がプロジェクトとそのすべてのファイルを宣言するために使用するプロジェクトファイル。 |
| build/VideoController.qsf | 定義と割り当てファイル。コンパイル、フィッティング、使用するピンとその名前、パラメータなどのすべてのパラメータを設定します。Quartus Prime で作成されますが、Quartus Prime GUI を使用するよりも手動で変更する方が速い場合が多いです。 |
| build/VideoController_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 宣言。 |
| build/Video_Clock_III.vhd | 各種ビデオベースクロックを生成する 3 番目の FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。1 つの PLL では満たせないビデオベース周波数のために複数のクロックが必要なため、3 番目の PLL を使用します。 |
| build/Video_Clock_III_inst.vhd | 3 番目の PLL IP のインスタンス化宣言。 |
| build/Video_Clock_III.qip | 3 番目の PLL 要件の IP 宣言。 |
| build/Video_Clock_IV.vhd | 各種ビデオベースクロックを生成する 4 番目の FPGA オンボード PLL 宣言。Altera Megacore IP コンポーネントです。1 つの PLL では満たせないビデオベース周波数のために複数のクロックが必要なため、4 番目の PLL を使用します。 |
| build/Video_Clock_IV_inst.vhd | 4 番目の PLL IP のインスタンス化宣言。 |
| build/Video_Clock_IV.qip | 4 番目の PLL 要件の IP 宣言。 |
FPGA ビットストリームのビルド
Quartus Prime を Windows/Linux ワークステーションにインストールするか、以下に詳述する Docker イメージを作成できます。さまざまな Linux および Windows フレーバーでの多数のインストールの後、Docker の使用がこの複雑なパッケージを使用する最も簡単な方法です。
コンパイル:
1. Quartus Prime v13.1 を起動します(ローカルインストールまたは Docker イメージ)。
2. 'File->Open Project' でリポジトリクローンが保存されているディレクトリを検索し、<Clone Path>/MZ80A_80COLOUR/FPGA/build/VideoController.qpf ファイルを選択します。FPGA VideoController プロジェクトが開きます。
3. 'Processing->Start Compilation' を選択します。警告メッセージは無視して問題ありません。
4. 完了すると、<Clone Path>/MZ80A_80COLOUR/FPGA/build/output_files ディレクトリに VideoController.sof という名前のビットストリームが作成されます。
FPGA のプログラミング:
1. ビットストリームを FPGA にアップロードするには、Altera USB Blaster を USB ポート経由でビデオモジュール v2.x ボードの 10 ピン JTAG IDC コネクタに接続する必要があります。
2. Quartus Prime で 'Tools->Programmer' に進むと、新しい Programmer ウィンドウが起動します。
3. Programmer ウィンドウで 'Hardware Setup' をクリックし、USB アダプタを選択して 'Close' します。
4. 'Auto Detect' をクリックすると、EPM7512AET144、EP3C25E144、EPCS16 の 3 つのデバイスが検出されるはずです。
5. EP3C25E144 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files/VideoController.sof にある sof ファイルを選択し、Open をクリックします。
6. EP3C25E144 に対して 'Program/Configure' のチェックボックスを選択します。
7. 'Start' をクリックすると、コンパイルされたビットストリームで FPGA がプログラムされます。
8. FPGA のプログラミングは永続的ではなく、電源オフ時にビットマップが失われます。プログラミングを永続的にするには、以下の EPCS16 のプログラミング手順に従ってください。
EPCS16 のプログラミング:
1. ビットストリームを EPCS16(FPGA が電源投入時に読み取る不揮発性シリアルフラッシュ RAM)にアップロードするには、Altera USB Blaster を USB ポート経由でビデオモジュール v2.x ボードの 10 ピン JTAG IDC コネクタに接続する必要があります。
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>/MZ80A_80COLOUR/CPLD/build/output_files/VideoController.sof を選択します。
3d. 'Flash Loader' をクリックし、'Add Device' ボタンをクリックします。Cyclone III -> EP3C25 を選択し、OK をクリックします。
3e. 'SOF Data' をクリックし、'Add File' ボタンをクリックします。出力ファイル <Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files/VideoController.jic を選択し、OK をクリックします。
3f. 'Generate' ボタンをクリックすると、出力 JIC ファイルが <Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files/VideoController.jic として作成されます。
3g. 'Close' をクリックして Convert Programming File ウィンドウを閉じます。
4. Quartus Prime で 'Tools->Programmer' に進むと、新しい Programmer ウィンドウが起動します。
5. Programmer ウィンドウで 'Hardware Setup' をクリックし、USB アダプタを選択して 'Close' します。
6. 'Auto Detect' をクリックすると、EPM7512AET144、EP3C25E144、EPCS16 の 3 つのデバイスが検出されるはずです。
7. EP3C25E144 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files/VideoController.sof にある sof ファイルを選択し、Open をクリックします。
8. EPCS16 デバイスを右クリックし、'Edit->Add File' を選択して <Clone Path>/MZ80A_80COLOUR/CPLD/build/output_files/VideoController.jic にある jic ファイルを選択し、Open をクリックします。
9. EP3C25E144 に対して 'Program/Configure' のチェックボックスを選択します。
10. EPCS16 に対して 'Program/Configure' と 'Verify' のチェックボックスを選択します。
11. 'Start' をクリックすると、FPGA と EPCS16 不揮発性フラッシュ 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 の場合は 13.0.1 を該当するバージョンに置き換えてください。Quartus Prime 13.0.1 は古い MAX CPLD デバイスをサポートします。Quartus Prime 13.1 は古い Cyclone III デバイスをサポートします。 -
X DISPLAY 変数を X サーバーに向けて設定:
export DISPLAY=<X サーバーの IP またはホスト名>:<スクリーン番号 または :スクリーン番号> # 例: export DISPLAY=192.168.1.1:0X サーバーマシンで以下のコマンドを実行:
xhost + # またはプライベートでないネットワークでセキュリティを維持するために xhost <Docker ホストの IP> -
Quartus からアクセス可能なプロジェクトディレクトリを設定:
編集: zpu/docker/QuartusPrime/run_quartus.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 を接続すると Programmer ツール内で認識されます。インストールの一部として、USB-Blaster および USB-Blaster II の udev ルールと、CYC1000 開発ボード用の Arrow USB-Blaster ドライバーをインストールしています。 -
Quartus Prime を停止するには:
# Quartus Prime GUI のメインウィンドウから File->Exit で終了 # または docker stop quartus
CI/CD パイプライン
Jenkins パイプライン概要
パイプラインは Groovy スクリプト(videomodule-build.groovy)で定義され、以下のステージで構成されています:
| ステージ | 説明 |
|---|---|
| Checkout | Gitea から v2.0-video-module ブランチをクローン |
| Determine Version | 最後の Gitea リリースタグからバージョンを自動インクリメント |
| Build CPLD | Quartus II 13.0.1 SP1 を使用してビデオインターフェース CPLD 設計をコンパイル(MAX7000AE EPM7512AETC144-12) |
| Build FPGA | Quartus II 13.1 を使用してビデオコントローラ FPGA 設計をコンパイル(Cyclone III EP3C25E144C8) |
| Build CG ROM | 16個のキャラクタジェネレータ ROM セットから 32K CG-ROM イメージを組み立て |
| Build MIF Files | FPGA プログラミング用のメモリ初期化ファイルをパッケージ |
| Package Releases | 各コンポーネントのリリースアーカイブと統合パッケージを作成 |
| Create Gitea Release | バージョン付きリリースとすべてのアーティファクトを Gitea に公開 |
Docker ビルド環境
| イメージ | バージョン | 用途 | デバイスファミリ |
|---|---|---|---|
quartus-ii-13.0.1 |
13.0.1 SP1 Web Edition | CPLD コンパイル | MAX7000AE |
quartus-ii-13.1 |
13.1 Full Version | FPGA コンパイル | Cyclone III |
02:50:dd:72:03:01)とライセンスファイル(/opt/altera/license.dat)で設定され、Quartus II 13.1 Full Version を認証します。
Jenkins は VPS 上の Docker コンテナとして実行されます。CPLD および FPGA ビルドはシブリングコンテナとして実行され、Jenkins ワークスペースが各 Quartus コンテナにボリュームマウントされます。ホストパス変換(
/var/jenkins_home → /srv/jenkins/data)により、ワークスペースがシブリングコンテナからアクセス可能になります。
Webhook 設定
main、master、または v2.0-video-module ブランチへのプッシュイベント時に Jenkins パイプラインをトリガーします。Webhook は Generic Webhook Trigger プラグインをトークン videomodule-build-trigger で使用します。
ビルドステージ詳細
CPLD ビルド — CPLD 設計(CPLD/build/VideoInterface.qpf)は Docker コンテナ内の Quartus II 13.0.1 SP1 を使用してコンパイルされます。コンパイルフローでは解析&合成、フィッティング、タイミング解析、アセンブラ、および EDA ネットリスト生成を実行します。出力:VideoInterface.pof。
FPGA ビルド — FPGA 設計(FPGA/build/VideoController.qpf)はフルライセンスの Quartus II 13.1 を使用してコンパイルされます。Cyclone III EP3C25E144C8 設計には PLL クロックジェネレータ、ビデオバッファ RAM、シリアルフラッシュローダー、およびデュアルポート RAM IP コアが含まれます。出力:VideoController.sof。
キャラクタジェネレータ ROM — make_cgrom.sh スクリプトは個別のキャラクタジェネレータ ROM ファイルを連結して単一の 32K バイトイメージ(COLOURBOARD_CG.rom)を作成します。このイメージには各 4K の 8 ブロックに編成された 16 の CG-ROM セットが含まれます:
| ブロック | スロット | ROM セット |
|---|---|---|
| 0 | 0-1 | MZ-80A (2K) + MZ-80K (2K) |
| 1 | 2-3 | MZFONT (2K) + MZ-80K2E 日本語 (2K) |
| 2 | 4-5 | MZ-700 (4K) |
| 3 | 6-7 | MZ-700 日本語 (4K) |
| 4 | 8-9 | MZ-80A (2K) + MZ-80B (2K) |
| 5-7 | 10-15 | 予約済み(MZ-80A ROM で埋め込み) |
リリースアーティファクト
ビルドが成功するたびに、以下のリリースアーカイブが Gitea に生成されます:
| アーティファクト | 内容 |
|---|---|
VideoModule-CPLD-vX.XX.tar.gz |
CPLD ビットストリーム(VideoInterface.pof) |
VideoModule-FPGA-vX.XX.tar.gz |
FPGA ビットストリーム(VideoController.sof) |
VideoModule-ROMs-vX.XX.tar.gz |
キャラクタジェネレータ ROM(COLOURBOARD_CG.rom) |
VideoModule-MIF-vX.XX.tar.gz |
メモリ初期化ファイル(18個の .mif ファイル) |
VideoModule-Complete-vX.XX.tar.gz |
全アーティファクトの統合パッケージ |
パイプライン設定
パイプラインの主要な環境変数:
| 変数 | 値 |
|---|---|
GITEA_URL |
https://git.eaw.app |
REPO_URL |
https://git.eaw.app/eaw/MZ80A_80COLOUR.git |
QUARTUS_CPLD |
quartus-ii-13.0.1(Docker イメージ) |
QUARTUS_FPGA |
quartus-ii-13.1(Docker イメージ) |
QUARTUS_BIN |
/opt/altera/quartus/bin |
QUARTUS_MAC |
02:50:dd:72:03:01(ライセンス MAC) |
手動ビルドトリガー
Jenkins API 経由で手動でビルドをトリガーするには:
CRUMB=$(curl -sf -u user:pass "https://jenkins.eaw.app/crumbIssuer/api/json" | grep -o '"crumb":"[^"]*"' | cut -d'"' -f4)
curl -sf -u user:pass -H "Jenkins-Crumb: $CRUMB" -X POST "https://jenkins.eaw.app/job/VideoModule-Build/build"
メール通知
support@net2net-ips.com に送信されます。成功メールにはバージョン番号とビルドされたコンポーネントのリストが含まれます。失敗メールにはコンソールログ確認用のビルド URL が含まれます。
クレジット
ライセンス
GNU General Public License v3
ソースファイルは有用であることを期待して配布されていますが、商品性や特定目的への適合性の暗黙の保証を含め、いかなる保証もありません。詳細は GNU General Public License をご覧ください。
このプログラムとともに GNU General Public License のコピーを受け取っているはずです。受け取っていない場合は http://www.gnu.org/licenses/ をご覧ください。