MCS6502 Peripheral

MCS6502ファミリにはいくつかのI/O用LSIがありますが、ここではMCS6522 VIAを取り上げます。
MCS6522はVersatile Interface Adapter (VIA)と呼ばれ、MC6821 PIAと類似のパラレルポートに加え、タイマと同期式シリアル入出力ポートが組み込まれたLSIです。VIAってのは、まぁ、何でもありのインターフェースLSIってなことですね。これはMCS6502の周辺LSIですからMC6800系のバスタイミングに適合し、MCS6502の他MC6800/MC6809/MC68000なんかに簡単に接続できます。
特にシフトレジスタに毛の生えたような同期式シリアル入出力を内蔵していたのは、当時としては珍しかったかもしれません。シングルチップコンピュータの中に同様のポートが集積された例はありますが、8 bit CPUを用いた場合にはパラレルポートとソフトウェアでエミュレートすることが多かったので。シングルチップコンピュータ用の周辺LSIを接続したり、シフトレジスタを用いてパラレル入出力ポートを安価にいくつか追加することのできる、ちょっと便利なポートでした。MicroWireインターフェースみたいなというか、後のMotorolaのSPIと類似のポートですね。

SY6522
これはSynertek社のSY6522Aで、2 MHzクロック動作可能なタイプ。

例によって、MC6821とピン配置を似せてあって、40ピン中34ピンまでが共通です。残り6端子が変わっていますが、これはアドレスを割り当てられているレジスタ数を4から16に増やしたため、その分のレジスタ選択端子を追加して割り込み要求やチップセレクトなどを共通化したり省略したためです。具体的には、こうなっています。

VSS  1      40 CA1
PA0  2      39 CA2
PA1  3      38 RS0 (IRQA*)
PA2  4      37 RS1 (IRQB*)
PA3  5      36 RS2 (RS0)
PA4  6      35 RS3 (RS1)
PA5  7      34 RES*
PA6  8      33 D0
PA7  9      32 D1
PB0 10      31 D2
PB1 11      30 D3
PB2 12      29 D4
PB3 13      28 D5
PB4 14      27 D6
PB5 15      26 D7
PB6 16      25 CK2
PB7 17      24 CS1
CB1 18      23 CS2*
CB2 19      22 R/W* (CS0)
VCC 20      21 IRQ* (R/W*)

MC6821と異なる意味のピンは()の中にMC6821の端子名を入れてあります。名称が異なっても意味的に同じものは同一として扱っています。
これだけ共通ですから、MC6821の機能の大部分はVIAにも含まれています。逆に追加された機能はレジスタの設定によって端子の動作を切り替えて使用することになってしまいます。

PIAと比べてVIAで追加された機能としては、次のようなものがあります。

レジスタマップを表にしてみました。
 
RS3 RS2 RS1 RS0 レジスタ名 意味
0 0 0 0 ORB/IRB 書き込み時Bポート出力レジスタ、読み出し時Bポート入力レジスタ
0 0 0 1 ORA/IRB 書き込み時Aポート出力レジスタ、読み出し時Aポート入力レジスタ
0 0 1 0 DDRB Bポートデータ方向レジスタ
0 0 1 1 DDRA Aポートデータ方向レジスタ
0 1 0 0 T1C-L 書き込み時T1下位バイトラッチ、読み出し時T1下位バイトカウンタ
0 1 0 1 T1C-H T1上位バイトカウンタ
0 1 1 0 T1L-L T1下位バイトラッチ
0 1 1 1 T1L-H T1上位バイトラッチ
1 0 0 0 T2C-L 書き込み時T2下位バイトラッチ、読み出し時T2下位バイトカウンタ
1 0 0 1 T2C-H T2上位バイトカウンタ
1 0 1 0 SR シフトレジスタ
1 0 1 1 ACR 補助制御レジスタ
1 1 0 0 PCR ペリフェラル制御レジスタ
1 1 0 1 IFR 割り込みフラグレジスタ
1 1 1 0 IER 割り込み許可レジスタ
1 1 1 1 ORA/IRA RS3..RS0 = 0001と同じだが、ハンドシェークに影響を与えない

ACRとPCRなどのビット割り当てが必要ですが、ちょっと資料がどこかに。また後で。
あと、特にMotorola系列のマイクロプロセッサと組み合わせるときには注意が必要です。MCS6502では16 bitデータをメモリに格納する場合には、アドレスの小さなメモリに下位バイトが納められます。ところがMC6800をはじめとするMotorolaのマイクロプロセッサでは、アドレスの小さな方には上位バイトが入ることになっています。さて、MCS6522ではタイマのデータのような16 bit値がMCS6502の慣習に沿って格納されるようになっています。つまり下位バイトが先に、上位バイトが後にきます。したがって、当然ながらMCS6502ではごく自然に扱うことができます。MCS6502にはプログラムカウンタ以外の16 bitレジスタがないので、必ず8 bit単位でデータを転送しなくてはならないのですが、間接アドレッシングなんかの都合で16 bitデータをメモリ上に確保すれば、自然とMCS6522の要求するバイト順になって、ブロック転送サブルーチンなんかで一気に初期設定を行うことが可能になるわけです。Motorola系列では上位バイトと下位バイトの格納順序が逆ですから、タイマなどの16 bitデータの初期設定にSTX命令などの16 bitデータをまとめて格納する命令を使いにくくなっています。8 bit単位でMCS6502と同じ順序になるように書き込まなくてはなりません。Motorolaのプロセッサに接続する際、RS0の論理を反転して、自然と上位バイトと下位バイトが入れ代わるように結線するテクニックもありますが、T1CやT2Cの書き込みでは、このテクニックも破綻します。というのは、T1Cに値を設定するには、先にT1C-Lに書き込んで下位バイトラッチに8 bitデータを書き込んでおき、続けてT1C-Hに上位バイトを書き込むと同時に下位バイトラッチから下位バイトカウンタにデータ転送を行うことになっているからです。先にT1C-Hに値を書き込んで次にT1C-Lへの書き込みを行うと、下位バイトカウンタに意図した値を書き込むことができなくなります。結局は、Motorolaのプロセッサではバイト順を常に意識して、1 Byteずつデータを転送するしかありません。

Macintoshなんかが使用していましたが、あれは一般プログラマがハードウェアを直接操作するコンピュータではないんで。確かPET-2001なんかが使っていたと思うけど、さらに知っている人は少ないだろうなぁ。KIM-1には載っていないよ。SYM-1には1個標準で1個オプション。AIM-65にはどうだったかな、システム用に1個でユーザ用に解放されているのが1個か、ってマニアック過ぎ?

Return to IC Collection