1970年代にマイクロコンピュータをパーソナルコンピュータ的に使おうとした場合、入出力装置に苦労しました。特にワンボードキットなんかの場合には、16進数を表示するためのLEDくらいしか出力に使えず、ゲームでも制約がありすぎます。そこで、当時のアマチュアが注目したのがテレビ受像機です。専用CRT表示装置に比べ信号帯域に制約があるとはいえ、40文字25行くらいの英数文字の表示くらいには使えます。
そこで、数MHzのクロックをカウンタで分周しながら、同期信号や表示内容を保持しているメモリを順次アクセスするためのアドレス信号を作成する回路を作成して、テレビに英数字を表示することがはやりました。まぁ、アマチュアが勝手に製作する台数などたいしたことはありませんが。しかし、汎用コンピュータの端末などを作る場合にも、同様の回路を作成して80文字24行くらいのCRT表示を行うことになります。また、コンピュータゲームもCRT表示回路が組み込まれるものが主流になります。
そんな回路が数多く作られるようになれば、当然それをLSI化しようということになります。その初期の傑作が、このCRT Controller (CRTC) HD46505です。特徴としては、多数のレジスタを持ち、走査線数とか1行の文字数などをCPUから与えられた数値によって可変することのできるプログラマブルな点が挙げられます。もちろん、それはCRT表示装置の同期周波数やその他のハードウェア的制約がありますから、特定のシステムの動作中に任意の値を設定して表示フォーマットを勝手に変更することはできません。しかし、設定次第によって、家庭用TV受像機の表示用にも、高解像度CRT表示機を用いたシステムにも、同じLSIを使用することができます。こうしてプログラマブルにすると、たとえばNTSC信号準拠のタイミング専用に開発したLSIより複雑な回路になります。しかし2倍複雑なLSIでも4倍の生産量になればずっと安価になるのがLSIの量産効果の特徴で、それを利用するためにも多様な条件に合わせて利用できるプログラマブルなCRTCというのは適していました。
上はオリジナルのHD46505Rで、中央と下は後にMotorola社からセカンドソース供給されたMC6845Lです。しかし中央のMC6845はパッケージから明らかに日立製造のものですね。日立型番を削り取ってマーキングし直したもののようです。
このCRTCは供給されるクロックを設定された値で分周して同期信号を作成します。分周する値はプログラマブルなので、CRT表示装置の種類などによって、プログラム実行時に同期信号の周期などを変化させることも可能です。さらに、同期信号作成に合わせて表示用メモリアドレスカウンタも動作させ、表示タイミングに合わせて画面リフレッシュ用のデータをメモリから読み出すことができます。アドレスカウンタのカウント開始アドレスなどもプログラマブルなので、カウント開始アドレスを書き換えてやることでハードウェアスクロールも可能になります。本来は文字表示用に設計されていますが、グラフィック表示用にも簡単に流用でき、その場合は最大512 KWord分のメモリを直接管理できます。また、ライトペンパルス入力も備え、ライトペン機能を簡単に実装できるようになっています。
ただし、CRTCが担当するのはCRT表示装置へのリフレッシュ動作で、表示内容をリフレッシュ用のメモリに書き込むのは、CRTCと連携して動く外部回路を介してCPUなどが行なうことになっています。外部回路の設計法やCPUのプログラムによっては、データ操作時に表示にちらつきが生じることもあります。そういった、表示データ書き込みに関する一切にCRTCは関与しません。もっとも、当時一般的だったTTL ICを使用して、このCRTCより機能の低い回路を実装するとICが10個から20個くらいは必要でしたし、プログラマブルな特徴を利用できる回路を実装しようとすればさらに複雑な回路が必要でしたから、本当に便利に使えたものです。もともとCRTCはMC6800系のバスインターフェースに接続するように設計されていますが、8080系のバスに接続する、同等の使用しやすいCRT表示制御用LSIがなかったため、8080AやZ80 CPUを使用したシステムにもバスインターフェースを工夫して接続されて使用されていました。
内蔵のレジスタはプログラマ側から見たモデルでは18個ありますが、アドレスレジスタでレジスタ番号を指定してから同一のアドレスに割り当てられた各レジスタをアクセスするようになっていたため、アドレス空間には2アドレスしか占有しません。まぁ、アドレス空間の節約というより40ピンのパッケージに納めるための苦肉の策かもしれませんが(単純に17のレジスタをアドレス空間に直接割り当てるとレジスタ指定用の端子が5本必要となり、端子数が4本増加してしまう)。
内蔵レジスタは次の18個で、書き込み専用や読み出し専用のものが多くなっています。
Reg. No. | Description | Read | Write |
R0 | Horizontal Total | No | Yes |
R1 | Horizontal Displayed | No | Yes |
R2 | H. Sync Position | No | Yes |
R3 | Sync Width | No | Yes |
R4 | Vertical Total | No | Yes |
R5 | V. Total Adjust | No | Yes |
R6 | Vertical Displayed | No | Yes |
R7 | V. Sync Position | No | Yes |
R8 | Interlace Mode and Skew | No | Yes |
R9 | Max Scan Line Address | No | Yes |
R10 | Cursor Start | No | Yes |
R11 | Cursor End | No | Yes |
R12 | Start Address (H) | Yes | Yes |
R13 | Start Address (L) | Yes | Yes |
R14 | Cursor (H) | Yes | Yes |
R15 | Cursor (L) | Yes | Yes |
R16 | Light Pen (H) | Yes | No |
R17 | Light Pen (L) | Yes | No |
名称の後に(H)と(L)とあるレジスタは本来は2 Byte分のレジスタで、上位バイトに(H)を、下位バイトに(L)を付けてあります。
CRTCはグラフィック表示にも使用できますが、本来は文字表示用です。CRTCには走査線が1文字分だけ水平に移動する時間と同じ周期を持つ文字クロック信号を与えて、それに同期してCRTCの内部回路が動作します。
R0は走査線1本に相当する時間を指定するためのレジスタで、その時間に相当する文字クロック信号のクロック数を書き込みます。その時間には、実際に文字が表示されている時間の他、水平同期信号が出力されている時間と表示期間の前後に必要な余白分の時間が含まれます。実際に書き込む値は、その合計クロック数から1を引いたものになります。
R1には1行当たりの文字数を書き込みます。
R2は水平同期信号が表示区間の開始から何クロック目になるかを設定するレジスタです。
R3には水平同期信号が出力される時間を文字クロック単位で設定します。下位4 bitだけが有効で、上位4 bitは0にしておきます。なお、CRTCの後期バージョンでは上位4 bitに垂直同期信号に相当する走査線本数を指定できます。その場合でも上位4 bitが0に設定されると垂直同期信号に走査線16本分が割り当てられるようになり、これはCRTCの初期バージョンと同一の動作ですから互換性が保たれることになります。
R4は1画面が文字表示の何行分の高さに相当するかを設定するレジスタです。表示区間の他、垂直同期信号とその前後にある無信号領域も行単位に換算して計算し、その値から1を減じたものを設定します。下位7 bitだけが有効です。
R5は、R4に設定した値の剰余分を走査線単位で設定するレジスタです。たとえば、1画面分の走査線数が262本で、1行が8走査線だと、R4には31を設定し、R5には6を設定します。下位5 bitだけが有効です。
R6は実際に画面に表示される行数で、必ずR4より小さくなります。下位7 bitが有効です。
R7は垂直同期信号が表示区間の開始行から何行目になるかを設定します。計算値から1を減じた値を書き込むことになっています。R4以下、R6以上の数値になるはずです。当然、このレジスタも下位7 bitだけが有効です。
R8はインターレース走査かノンインターレース走査か、インターレース走査なら奇数フィールドと偶数フィールドで同じものを表示するか、異なる情報を表示するか(垂直の分解能が2倍になる)を指示するレジスタです。改良型の後期バージョンでは、カーソルやブランキング信号のスキュータイミングも指示できます。通常、CRTCを用いた表示回路では、VRAMから文字コードを1クロックタイミングで読み出して、次の1クロックで文字コードをキャラクタジェネレータROMに与えて表示パターンを得るといった、一種のパイプライン構造でメモリのアクセス速度の割に高速なビデオ信号生成を行っています。初期バージョンでは必ずカーソルやブランキング信号は文字コード読み出しと同じタイミングで出力されていましたから、パイプライン段数に合わせてカーソルやブランキング信号にもフリップフロップを挿入して遅延を与える必要がありました。後期バージョンでは、この複数のフリップフロップを内蔵して、パイプライン段数をプログラムすることで表示パターン生成に合わせたタイミングでこれらの信号を出力できるようになりました。TTL ICを1, 2個くらい省略できるようになったわけです。
R9は1行の走査線数をプログラムします。下位5 bitだけが有効です。英数字は5×7ドットあれば表現できるので、1行を8本から12本程度に設定するのが多かったですね。罫線フォントで連続した線を引いたり、ゲーム表現で特殊キャラクタフォントで図柄を表示するには、行と行の間に隙間ができては都合が悪いので、キャラクタジェネレータROMのROWアドレス幅に合わせて8本程度に設定するのが普通でした。専用文字表示端末の場合には、逆に行と行の間に多少の余白があった方が見やすいので、フォントが縦に8ドットだとしたら走査線4本程度の空白部分を付け加えて合計12本くらいにプログラムします。
R10とR11はカーソルの表示パターンを設定するレジスタです。設定しだいで、文字表示全面をおおうカーソルも、文字の下にアンダーライン表示がなされるカーソルも、実現できます。またカーソルを常時表示したり、1秒に2回とか4回程度の点滅表示を行うように設定したりもできます。もちろん、カーソルを表示しない設定も行えます。
R12とR13はCRTCから見たリフレッシュ用メモリの表示開始アドレスを設定します。表示内容をスクロールするためには、CPUによってメモリ内のデータをブロック転送すればよいわけですが、この表示開始アドレスを一定量だけずらすことによっても同じことが実現できます。前者をソフトウェアスクロール、後者をハードウェアスクロールということもあります。ブロック転送すると1 KByte単位のデータ転送になるでしょうから、8 bitマイクロプロセッサでは10 ms単位の時間が必要となります。しかし、ハードウェアスクロールなら、レジスタふたつへの書き込みと、新たに表示領域に含まれることになるリフレッシュ用メモリの内容を書き換えるだけで済みますから、1 ms程度の処理時間しか必要としません。このCRTCは、比較的簡単にハードウェアスクロールが可能になっています。
R14とR15はカーソルを表示する位置を指定するためのレジスタです。このレジスタに設定する位置というのは、x-y座標的な指定ではなく、CRTCから見たリフレッシュ用メモリのアドレスによって指定されるようになっています。一見、抽象化されていなくて使いにくそうに思えますが、次に文字を表示する際には、このR14とR15によって表されるアドレスに文字コードを書き込んで、その後でアドレスをインクリメントすればよいのですから、書き込み位置を指しているポインタをそのまま使えるわけで、直接的で使いやすくなっています。
R16とR17はライトペン入力用のレジスタで、CRTCのLPSTB信号が入力されていた瞬間にCRTCが出力していたリフレッシュ用メモリのメモリアドレスがラッチされて、後でCPUから読みだせるようになっています。メモリアドレスから何行目の何文字目をライトペンが指していたかを求めるのはプログラムの仕事です。もっとも、ライトペンがCRT表示の信号を検出してロジックレベルまで増幅してLPSTB信号が変化するまでに時間が必要で、その間にCRTCが1 - 4文字くらい先を表示していることが普通ですから、一度その遅延時間を測定して、プログラムによって補正する必要があります。かわった応用としては、CRTCの出力するメモリアドレスをキーボードのスイッチマトリクスの駆動信号に流用して、ライトペン機能を用いてキー入力を行うというものもあります。なお、ライトペン入力をCRTCが検出しても、それを割り込みなどでCPUに知らせる機能はありませんから、別のI/Oポートや割り込み制御回路と併用する必要があります。
富士通がHD46505を改良して画面分割など機能を付け加えたMB89321A(だよね)。本来なら独立して記事を書きたいけど、資料が見つからない。出てきたら詳細を。
Return to IC Collection