これは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