Commodore 64(1982)
- 公開日: 2020/08/01
ハードウェア概要
コモドール64は1982年よりVIC-20の後継機として開発・販売されたパソコンであり、単一モデルとしては世界一売れたパソコンであるとされている[1]。VIC-20とは互換性があり、VIC-20のソフトをそのまま動作させることも可能である。
同年末には低価格版であるマックスマシーンが日本国内で販売されたが、VIC-1001同様やはり売れ行きはいま一つだったようだ。1985年には上位機種であるCommodore 128(発音はOne Twenty-Eight)が登場している。マックスマシーンやC128もコントローラ端子回りの実装は同じなのでまとめて説明する。
コントローラ端子の特徴
以下の説明は"Commodore 64 Programmer's Reference Guide"、"Commodore 64 memory map"及びcbm.ko2000.nuで見つけた回路図に基づく。本機はコントローラ端子を2つもっており、ピンアウトは以下の通りである。
pin# |
Controller 1 |
Controller 2 |
---|---|---|
1 |
Digital in / Digital out |
Digital in |
2 |
Digital in / Digital out |
Digital in |
3 |
Digital in / Digital out |
Digital in |
4 |
Digital in / Digital out |
Digital in |
5 |
Analog in |
|
6 |
Digital in / Digital out / Light Pen |
Digital in |
7 |
VCC |
|
8 |
GND |
|
9 |
Analog in |
デジタル端子であるピン1~4、6については、I/Oポートをキーボードと共有している(後述)都合上、入出力可能なのはコントローラ端子1のみである。また、コントローラ端子1のピン6はライトペン入力としても利用可能である。
ハードウェア実装
上記回路図からコントローラ端子周りを抜粋したものを下図に示す。
コントローラ端子はCPU(MOS6510又は8500)[2]の周辺チップであるMOS6526(CIA)と、サウンドコントローラであるMOS6580(SID)のI/Oポートを使って実装されている。なお、CIAは2つ使われているがコントローラ端子で使用するのはそのうちの一方である。ライトペン入力検出用としてビデオコントローラであるVIC-II[3]も利用される。
C128では性能向上版の8502が使用されている
コントローラ端子1のピン1〜4、6はCIAのPB0〜4に接続されている。また、コントローラ端子2のピン1〜4、6はCIAのPA0~4に接続されている。CIAのPA0~7(WRITE)、PB0~7(READ)は通常はキーボードスキャンのために使用されている。ピン5, 9はスイッチICである4066を介してSIDのアナログ入力端子に接続されている。コントローラ端子1のピン6はVIC-IIのライトペン入力端子に接続されている。
4066は端子E0~E3に応じて、Y0~Y3とZ0~Z3とを開閉するスイッチである。上図の構成では、PA6をH、PA7をLにするとコントローラ端子1のピン5、9とSIDのPOTY、POTX端子がつながり、逆にするとコントローラ端子2のピン5、9とSIDのPOTY、POTX端子がつながる。
制御方法
各ピンの制御方法は以下の通りである。
ピン1〜4、6のデジタル入出力については、アドレス$DC00、$DC01、$DC03を使用する。アドレス$DC02はピン5、9のアナログ入力検出の際に使用する。
port# |
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
---|---|---|---|---|---|---|---|---|
DC00 (R/W) |
Read / Write PA of CIA#1 |
|||||||
PA7 |
PA6 |
PA5 |
PA4 |
PA3 |
PA2 |
PA1 |
PA0 |
|
DC01 (R/W) |
Read / Write PB of CIA#1 |
|||||||
PB7 |
PB6 |
PB5 |
PB4 |
PB3 |
PB2 |
PB1 |
PB0 |
|
DC02 (R/W) |
Set(W) or Check(R) Direction for PA of CIA#1 (1=Read&Write, 0=Read Only) |
|||||||
PA7 |
PA6 |
PA5 |
PA4 |
PA3 |
PA2 |
PA1 |
PA0 |
|
DC03 (R/W) |
Set(W) or Check(R) Direction for PB of CIA#1 (1=Read&Write, 0=Read Only) |
|||||||
PB7 |
PB6 |
PB5 |
PB4 |
PB3 |
PB2 |
PB1 |
PB0 |
デジタル信号の入力は$DC00と$DC01を読み出すだけでよい[4]。
厳密には、特にコントローラ1端子の入力を読み取る場合は、事前にSEI命令を使って割り込みを禁止し、読み取りが終わったあとにCLI命令で割り込みを許可することが好ましいとは思う
デジタル信号の出力手順は以下の通り。
アドレス$DC03の内容を保存する
アドレス$DC03の信号を出力したいピンに対応したビットに1を書き込む
アドレス$DC01を使って信号出力を行う
1.で保存した内容をアドレス$DC03に書き込む
ピン5、9の読出しは、CIAのPA6、7の制御を伴うため多少複雑になる。手順は以下の通り。
SEI命令を実行して割り込みを禁止する
アドレス$DC02の内容を保存する
アドレス$DC02のビット6、7に1を書き込む
アドレス$DC00のビット6、7でアナログ入力を検出する端子を指定する。ビット6=1、ビット7=0で端子1の、ビット6=0、ビット7=1で端子2のアナログ入力の検出を行う
512サイクル待機[5]
アドレス$D419の読出しでピン9のアナログ値を、$D41Aの読出しでピン5のアナログ値を取得する
2.で保存した内容をアドレス$DC02に書き込む
CLI命令を実行して割り込みを許可する
アナログ入力のデータ更新は512サイクルごとなので
ライトペンは、$D013でX座標を、$D014でY座標を読み出す。