トップページ > 電子工作インデックス > CRTCその1 > HD6445の仕様
HD6445の元となったICはもともとZ80の競争相手だったMC6800(モトローラ社)の周辺デバイスとして 設計されたものですが、その汎用性の高さからZ80のインターフェース回路にも 盛んに用いられていたそうです。その後Z80と接続した時にしっくりくるようにリメイクされたものが、この6445 なのだそうです。また、ちょっとロジックをかませるだけでほかのCPUでも普通に使用可能です。 素直で使いやすいICだと思います。(コレしか使ったことがないから何とも言えないのですが… )
ここに書いてあることは、結局のところ40ページ分の英語資料の和訳にすぎないので、若干怪しい部分も 含まれます…。ご了承ください。なお、ICのピン名称の前についている「/」は負論理 であることを示すものです。
GND | 入力ピン | グランドです。 |
---|---|---|
/RES | 入力ピン | "L"でリセット |
LPSTB | 入力ピン | 「ライトペン」なるモノと関係あるそうです… |
MA0〜MA13 | 出力ピン | VRAMのメモリアドレス指定用 |
DISPTMG | 出力ピン | ピクセルデータを出力に"H"レベルになります。 |
IRQ | 出力ピン | 割り込み要求信号です |
Vcc | 入力ピン | +5V DC |
CLK | 入力ピン | クロックパルス入力。最大4MHz。 |
/WR | 入力ピン | ライト・イネーブル。"L"でアクティブ。 |
/RD | 入力ピン | りード・イネーブル。"L"でアクティブ。 |
RS | 入力ピン | レジスタ・セレクト。"L"でアドレスレジスタ。 |
/CS | 入力ピン | "L"でチップセレクトです。 |
D0〜D7 | 入出力ピン | データ入出力 |
RA0〜RA4 | 出力ピン | ラスタ・アドレス出力 |
HSYNC | 出力ピン | 水平同期信号出力 |
VSYNC | 出力ピン | 垂直同期信号出力 |
↑ざっと説明します…。まず”Vcc”と”GND”に電源をつなぎましょう。”CLK”にはクロックを入れましょう…。 (クロックについては後述。)さらに、”LPSTB”(Light Pen Strobe)は"L"レベルに落としておきます。 「ライトペン」というハードウェアは聞いたことがありません(汗)。興味はあるものの、今回は無難に済ませるために使わないことにします。 ”IRQ”(Interrupt Request)は放置しましょう。割り込みとは別のやり方でCPUと通信 します。最後に、CPUからの制御信号を受けるピンの1つである”/RD”(Read)は常に"H" (非アクティブ)としておきます。CPU側からCRTCの内部レジスタの値を確認することは今回 はありませんので。
…と、ここまでで必要ないピンの処理は終わりました。ここからは、各ピンが「CPU」、 「RAM」、「ディスプレイ」のどこに接続されるのかを中心に話を進めていきます。
CPUに接続されるのは”D0〜D7”(Data0〜7)ピン、書き込みタイミング信号を入力する ”/WR”(Write)ピン、CPUからのデータがレジスタの番地を指すのかデータそのものかを 指定する”RS”(Resister Select)ピン、チップ全体のアクティブ/非アクティブを 決める”/CS”(Chip Select)ピン…の、データバス8本+制御線3本となります。
VRAMに接続するのは、”MR0〜13”(Memory Address0〜13) ピン、”RA0〜4”(Raster Address)ピンです。結局CRTCからRAMに接続する信号線は アドレス信号だけとなっています。また、メモリアドレスとラスタアドレスの違いは 後述です。
…ただこれだけなのですが、CPUとの配線のイメージについて触れておきます。 ”RS”はこの後説明するとおり、アドレス信号(的なイメージ)なのでCPUのアドレス 指定ピンの最下ビットに接続します。”/CE”はCRTCそのものを選択するかどうか の信号なので、アドレスデコーダ(もしくはCPUのアドレスの上位ピン)をつなぐ 感じで。”/WR”はCPUによりけりですが、Z80なら”/IORQ”と”/WR”のORを とったもので可能です。H8で制御するなら、プログラムで自由にいじれますので とてもラクに使えます。回路のデバッグ(?)についH8を持ち出してしまうのは こういった理由なわけで…。
前述のとおり、CRTC:HD6445はプログラマブルなカウンタの集合体…でした。 そのため、HD6445の内部には設定値を保存するための”レジスタ”があります。
アドレス | レジスタ名 | 備考 |
---|---|---|
0 | 水平最大ドット数 | 画面のヨコ幅を決めます。 |
1 | 水平表示ドット数 | 実際に表示する長さを決めます。表示ドット数 = RAMの使用ブロック数 |
2 | 水平同期位置 | 水平同期を入れるタイミングです。ドット数で、設定値は2<3<1とします。 |
3 | 同期信号パルス幅 | 上位4ビットが垂直同期、下位4ビットが水平同期です。 |
4 | 垂直方向最大ドット数 | 画面のタテ幅を決めます。 |
5 | トータル・ラスタ・アジャスト | よくわかりません(爆)とりあえず"1"に設定。 |
6 | 垂直表示ドット数 | 実際に表示するタテの長さを決めます。 |
7 | 垂直同期位置 | 垂直同期を入れるタイミングです。設定値は6<7<5とします。 |
8 | インタレース・モード | "0"にしておきます。 |
9 | 最大ラスタ・アドレス | ラスタ・アドレスの項参照です。 |
12 | VRAM初期アドレス上位 | "0"にしておきます。 |
13 | VRAM初期アドレス下位 | "0"にしておきます。 |
このHD6445には「入力用のアドレスピン」なんて無かったはずです。「アドレス(A)」と 名のつくピンは全部出力ピンでした。で、どうやって内部レジスタのアドレスを指定する かというと、”RS”ピンを"L"にした状態でデータバスにデータを送ると、それは CRTC内部のレジスタ・アドレスを指すものと認識されます。”RS”ピンを"H"にすると そのデータは書き込む「データ(数値)」だと認識されます。データピンを2通りの 使い方にできる節約(?)設計なんですね。ICのピンの数を40ピンに押させるための 苦肉の策だそうです。
…ということで、内部レジスタに値を書き込むためには、"RS”ピンをガチャガチャいじって 「アドレスを書き込む→データを書き込む」で1セットの動作となります。設定値はすべて16進数に なおして書き込まなければならない点に注意!この内部レジスタよって設定される対象は、 結局水平同期信号と垂直同期信号の周波数だというイメージで。
この作業、アナログオシロスコープがあると非常に楽にすることができます。 (別にディジタルでも構いませんが、雰囲気の問題です 笑) 内部レジスタには自由な値を設定できるとはいえ、実際の液晶ディスプレイは規定外の タイミング信号を受け付けてくれないので、「このくらいの値がいい」と決めたものを まず試し、"Out Of Range"が表示されてしまったら少しずつずらしていく…という 方法で私はやりました。その際、HSYNCとVSYNCピンにプローブを当てて常に波形と 周波数を監視しながら作業をすると目安になるので楽です。
ただ、それでもしんどかったのでまたH8とPCに頼り、 補助ソフトウェアをつくってしまいました。