トップページ > 電子工作インデックス > CRTCその1 > キャラクタCRTCの動作

”キャラクタ用”CRTCの動作

これまでで、一通り重要パーツの説明が完了しました。今度はキャラクタCRTCの回路全体がどのような動作で 画面に文字を出すのか考えていきます。ここからが佳境ですね…。

まず各部の説明の前に全体像をイメージしておきます。CRTCから出力されるのは 結局「アドレス信号」だけでした。このアドレス信号には2種類あって、 「メモリアドレス」と呼ばれるものと、「ラスターアドレス」と呼ばれるものです。 (「ラスター(raster)」は「走査線」のことです。)このうち、メモリアドレス出力は VRAMのアドレスピンへ、ラスタアドレス出力は”キャラクタROM”というもののアドレス ピンへ接続されています。キャラクタROMは初出ですが、名前のとおり文字データ (フォント)を格納してあるROM(Read Only Memory)のことです。キャラクタROMはその働きから、 「キャラクタジェネレータ(Character Generator)」と呼ばれることもあり、それを 略して”CG-ROM”と表記されることもしばしばあります。(現代においてではなく、 もちろん当時の文献とかですよ?)
そして、キャラクタROMのデータ線8本が「シフトレジスタ」に接続されていて 最終的にドットデータを出力することになります。このシフトレジスタの出力を RGBのすべてに接続すると、何も信号が無い「黒」かRGBのすべてが"H"レベル、すなわち 「白」のどちらかが表示されるので、「白黒文字ディスプレイ」のできあがり…という ことになります。

使用したROMについて

今回使うROMは、大容量が必要なわけではないので32KB EEP-ROM (Electrically Erasable Programmable ROM …電気的に消去可能なROM)のμPD28C64を 使うことにします。EEP-ROMなんて贅沢で、EP-ROMでいいじゃないかという話なのですが、 いろいろ実験しながらフォントを作りたいので何度も手軽に消せるEEP-ROMを選びました。 なお、データシートを検索する際は”uPD28C64”と、μをuに変えると 確実にヒットします。

ピン配置を見ると、なんだか前に出てきたS-RAMと似ていますね。一般的にメモリーICは ROM・RAM、容量の大小に関わらず、ピン・コンパチブルな仕様となっています。 (※もちろん、ピン数の違うパッケージ間では互換性はありません…)
ROMの書き込みサイクル、読み出しサイクルはRAMの時と全く同じです。また、書きこむ 装置の詳細はROMライターの項参照です。

キャラクタROMの作り方

さて、用意したROMにフォントデータを入れていく作業をします。まず、フォントデータの 仕様は…

  1. 8×8dotの大きさ
  2. いわゆる半角英数字のみ
  3. ASCIIコードで読み出せるようにする
とします。ではどうやってフォントを作るかというと、PCのペイントなどで8×8の文字を表示 させて、それを見て8×8の方眼紙を手で塗りつぶして作成します。それを16進数に なおして、テキストエディタに打ち込んで、ROMライターで書き込む…と。 イチから自分で作ると ものすごい達成感でうれしくなります。面倒だという場合は上で紹介したROMライター 対応データ形式の作成済みキャラクタデータをどうぞ。


では、作ったデータをどの番地に書き込むかということについて考えていきます。

図のとおり、8×8のマスの中で考えたフォント・データをもとに、データ バスに「横一列(8ビット)」を1セットとして書き込んでいきます。その際、 その文字を構成する「行(全8行)」をアドレスバスの下位3ビットA0〜A2(3ビットあるから0〜7の 8行分を指定できる)に与え、その上位ビットA3〜A10の8本には、 その文字のASCIIコードを与えます。こうして文字データを書き込むことで 、あとから画面に文字を表示させるのに都合がよくなります。

キャラクタROMによる文字の再生

それでは実際に動作を見ていきましょう。 まず、VRAMのアドレスバスに接続されているCRTCの「メモリ・アドレス」出力 ピンは、0,1,2…とインクリメントされていきます。 VRAMにはCPUによりASCIIコードが書き込まれているので、 そのアドレスごとのASCIIコードがVRAMのデータバスに出力されます。 すると、下の図の通り、VRAMから出力されたデータはキャラクタROMに「アドレス」として入力されるの ですが、 その「アドレス」にはASCIIコードに対応した文字が書き込んでおいたので、 その文字に対応したデータが出力される…という 仕掛けです。ただ、その「文字」は8行分のデータに分けて 保存してあるため、ASCIIコードで文字を指定し、 かつ「ラスタアドレス」からのアドレス信号で、その文字の中でどの行を選択するのか を決定する…ということです。これが1文字表示のロジックです。




次は、連続して文字を表示するしくみについて考えます。
まず、一番パタパタと忙しく動くのはメモリ・アドレスピンの下位の 方だ…というイメージを持っていてください。その次に忙しく変化するのが ラスタ・アドレスです。ここではヨコ1行に表示する文字の数は60文字と 仮に決めます。 また、1文字は8×8のマスでフォントを作っているので、 最大ラスタアドレスは"7"(つまり8行分)と設定 します。



まぁ、↑の表を見てもあまりイメージがわかないので、下の図を合わせてもう一度 動作のイメージづくりを…。 まず、1行目に表示するすべての文字の「第一行目」をダーっと出力します。 「第一行目」なのでラスタ・アドレスは常に"0"のままです。表示する文字は 変化するので、VRAMからのデータ…すなわちキャラクタROMのアドレスバスへの ASCIIコード入力はコロコロと変化します。(※ ↓の図の@のライン。)

それが1行分終わったら、次は各文字の「第二行目」を書くために、 ラスタアドレスを"1"とし、また同様にVRAMからのデータをもらって だーっとやります。(※ ↓の図のAのライン。)

…ということで、1文字分のラスタ8行を掃き終わったら「文章の1行目」の 表示が完了となります。そうしたら、次は「文章の2行目」を表示するために、 VRAMのアドレスを1行分の文字数だけ飛ばして、また同様の処理を始めます。 (※ ↓の図のHのライン。)



…以上のようにしてキャラクタCRTCは文字を画面に表示していきます。 1文字を表示するために必要なことはASCIIコード1つ(1バイト)をVRAMに書き込む だけなので、必要なデータ量はとても少なくなります。また、CRTCは 結局タダのカウンタ動作なのですが、プログラマブルでかつ 巧妙なタイミング生成を行っていることから非常に便利だと感じました。

ここで、「RAMの出力はパラレルな8ビットだから、それを直接RGB信号には できないのでは?」と、また問題が発生します。ここは、パラレル入力仕様の シフトレジスタ(74HC165など)で対処します。なお、1アドレス分のデータが 出力されている時間内に8つのシリアルデータを出さなければならないので、 ドットクロックはCRTCに用いるクロックパルスの8倍の周波数が必要となります。




前へ   次へ